Skip to content
This repository has been archived by the owner on Apr 11, 2024. It is now read-only.

Add new relocation type support #57

Merged
merged 1 commit into from
Jul 25, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
201 changes: 200 additions & 1 deletion docs/LoongArch-ELF-ABI-CN.adoc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
= 龙芯架构 ELF psABI 规范
龙芯中科技术股份有限公司
v1.00
v2.00
:docinfodir: ../themes
:docinfo: shared
:doctype: book
Expand Down Expand Up @@ -647,6 +647,205 @@ v1.00
|R_LARCH_GNU_VTENTRY
|GNU C++ vtable 支持
|

4+|... 保留项

|64
|R_LARCH_B16
|18 位相对 PC 跳转
|`+(*(uint32_t *) PC) [25 ... 10] = (S+A-PC) [17 ... 2]+`

带 18 位有符号数溢出和4字节对齐检测功能

|65
|R_LARCH_B21
|23 位相对 PC 跳转
|`+(*(uint32_t *) PC) [4 ... 0] = (S+A-PC) [22 ... 18],+`

`+(*(uint32_t *) PC) [25 ... 10] = (S+A-PC) [17 ... 2]+`

带 23 位有符号数溢出和4字节对齐检测功能

|66
|R_LARCH_B26
|28 位相对 PC 跳转
|`+(*(uint32_t *) PC) [9 ... 0] = (S+A-PC) [27 ... 18],+`

`+(*(uint32_t *) PC) [25 ... 10] = (S+A-PC) [17 ... 2]+`

带 28 位有符号数溢出和4字节对齐检测功能

|67
|R_LARCH_ABS_HI20
|32/64 位绝对地址的 [31 ... 12] 位
|`+(*(uint32_t *) PC) [24 ... 5] = (S+A) [31 ... 12]+`

|68
|R_LARCH_ABS_LO12
|32/64 位绝对地址的 [11 ... 0] 位
|`+(*(uint32_t *) PC) [21 ... 10] = (S+A) [11 ... 0]+`

|69
|R_LARCH_ABS64_LO20
|64 位绝对地址 [51 ... 32] 位
|`+(*(uint32_t *) PC) [24 ... 5] = (S+A) [51 ... 32]+`

|70
|R_LARCH_ABS64_HI12
|64 位绝对地址 [63 ... 52] 位
|`+(*(uint32_t *) PC) [21 ... 10] = (S+A) [63 ... 52]+`

|71
|R_LARCH_PCALA_HI20
|相对 PC 偏移 32/64 位的 [31 ... 12] 位
|`+(*(uint32_t *) PC) [24 ... 5] = (((S+A) & ~0xfff) - (PC & ~0xfff)) [31 ... 12]+`

`+注意:所有相对 PC 偏移计算都不包含低12位。+`

|72
|R_LARCH_PCALA_LO12
|32/64 位地址的 [11 ... 0] 位
|`+(*(uint32_t *) PC) [21 ... 10] = (S+A) [11 ... 0]+`

|73
|R_LARCH_PCALA64_LO20
|相对 PC 偏移 64 位的 [51 ... 32] 位
|`+(*(uint32_t *) PC) [24 ... 5] = (S+A - (PC & ~0xffffffff)) [51 ... 32]+`

|74
|R_LARCH_PCALA64_HI12
|相对 PC 偏移 64 位的 [63 ... 52] 位
|`+(*(uint32_t *) PC) [21 ... 10] = (S+A - (PC & ~0xffffffff)) [63 ... 52]+`

|75
|R_LARCH_GOT_PC_HI20
|GOT 表项相对 PC 偏移 32/64 位的 [31 ... 12] 位
|`+(*(uint32_t *) PC) [24 ... 5] = (((GP+G) & ~0xfff) - (PC & ~0xfff)) [31 ... 12]+`

|76
|R_LARCH_GOT_PC_LO12
|GOT 表项 32/64 位地址的 [11 ... 0] 位
|`+(*(uint32_t *) PC) [21 ... 10] = (GP+G) [11 ... 0]+`

|77
|R_LARCH_GOT64_PC_LO20
|GOT 表项相对 PC 偏移 64 位的 [51 ... 32] 位
|`+(*(uint32_t *) PC) [24 ... 5] = (GP+G - (PC & ~0xffffffff)) [51 ... 32]+`

|78
|R_LARCH_GOT64_PC_HI12
|GOT 表项相对 PC 偏移 64 位的 [63 ... 52] 位
|`+(*(uint32_t *) PC) [21 ... 10] = (GP+G - (PC & ~0xffffffff)) [63 ... 52]+`

|79
|R_LARCH_GOT_HI20
|GOT 表项 32/64 位绝对地址的 [31 ... 12] 位
|`+(*(uint32_t *) PC) [24 ... 5] = (GP+G) [31 ... 12]+`

|80
|R_LARCH_GOT_LO12
|GOT 表项 32/64 位绝对地址的 [11 ... 0] 位
|`+(*(uint32_t *) PC) [21 ... 10] = (GP+G) [11 ... 0]+`
Comment on lines +740 to +748
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The names of 79 and 80 are not the same as in the code, which is correct?

The names in the binutils code are:

R_LARCH_GOT64_HI20 79
R_LARCH_GOT64_LO12 80

https://github.com/loongson/binutils-gdb/blob/291cb57c2947868201be6c2b0b903d318a7df90d/include/elf/loongarch.h#L161

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


|81
|R_LARCH_GOT64_LO20
|GOT 表项 64 位绝对地址的 [51 ... 32] 位
|`+(*(uint32_t *) PC) [24 ... 5] = (GP+G) [51 ... 32]+`

|82
|R_LARCH_GOT64_HI12
|GOT 表项 64 位绝对地址的 [63 ... 52] 位
|`+(*(uint32_t *) PC) [21 ... 10] = (GP+G) [63 ... 52]+`

|83
|R_LARCH_TLS_LE_HI20
|TLS LE 符号相对 TP 寄存器偏移 32/64 位的 [31 ... 12] 位
|`+(*(uint32_t *) PC) [24 ... 5] = T [31 ... 12]+`

|84
|R_LARCH_TLS_LE_LO12
|TLS LE 符号相对 TP 寄存器偏移 32/64 位的 [11 ... 0] 位
|`+(*(uint32_t *) PC) [21 ... 10] = T [11 ... 0]+`

|85
|R_LARCH_TLS_LE64_LO20
|TLS LE 符号相对 TP 寄存器偏移 64 位的 [51 ... 32] 位
|`+(*(uint32_t *) PC) [24 ... 5] = T [51 ... 32]+`

|86
|R_LARCH_TLS_LE64_HI12
|TLS LE 符号相对 TP 寄存器偏移 64 位的 [63 ... 52] 位
|`+(*(uint32_t *) PC) [21 ... 10] = T [63 ... 52]+`

|87
|R_LARCH_TLS_IE_PC_HI20
|TLS IE 符号 GOT 表项相对 PC 偏移 32/64 位的 [31 ... 12] 位
|`+(*(uint32_t *) PC) [24 ... 5] = (((GP+IE) & ~0xfff) - (PC & ~0xfff)) [31 ... 12]+`

|88
|R_LARCH_TLS_IE_PC_LO12
|TLS IE 符号 GOT 表项 32/64 位地址的 [11 ... 0] 位
|`+(*(uint32_t *) PC) [21 ... 10] = (GP+IE) [11 ... 0]+`

|89
|R_LARCH_TLS_IE64_PC_LO20
|TLS IE 符号 GOT 表项相对 PC 偏移 64 位的 [51 ... 32] 位
|`+(*(uint32_t *) PC) [24 ... 5] = (GP+IE - (PC & ~0xffffffff)) [51 ... 32]+`

|90
|R_LARCH_TLS_IE64_PC_HI12
|TLS IE 符号 GOT 表项相对 PC 偏移 64 位的 [63 ... 52] 位
|`+(*(uint32_t *) PC) [21 ... 10] = (GP+IE - (PC & ~0xffffffff)) [63 ... 52]+`

|91
|R_LARCH_TLS_IE_HI20
|TLS IE 符号 GOT 表项 32/64 位绝对地址的 [31 ... 12] 位
|`+(*(uint32_t *) PC) [24 ... 5] = (GP+IE) [31 ... 12]+`

|92
|R_LARCH_TLS_IE_LO12
|TLS IE 符号 GOT 表项 32/64 位绝对地址的 [11 ... 0] 位
|`+(*(uint32_t *) PC) [21 ... 10] = (GP+IE) [11 ... 0]+`

|93
|R_LARCH_TLS_IE64_LO20
|TLS IE 符号 GOT 表项 64 位绝对地址的 [51 ... 32] 位
|`+(*(uint32_t *) PC) [24 ... 5] = (GP+IE) [51 ... 32]+`

|94
|R_LARCH_TLS_IE64_HI12
|TLS IE 符号 GOT 表项 64 位绝对地址的 [63 ... 52] 位
|`+(*(uint32_t *) PC) [21 ... 10] = (GP+IE) [63 ... 52]+`

|95
|R_LARCH_TLS_LD_PC_HI20
|TLS LD 符号 GOT 表项相对 PC 偏移 32/64 位的 [31 ... 12] 位
|`+(*(uint32_t *) PC) [24 ... 5] = (((GP+GD) & ~0xfff) - (PC & ~0xfff)) [31 ... 12]+`

|96
|R_LARCH_TLS_LD_HI20
|TLS LD 符号 GOT 表项 32/64 位绝对地址的 [31 ... 12] 位
|`+(*(uint32_t *) PC) [24 ... 5] = (GP+IE) [31 ... 12]+`

|97
|R_LARCH_TLS_GD_PC_HI20
|TLS GD 符号 GOT 表项相对 PC 偏移 32/64 位的 [31 ... 12] 位
|`+(*(uint32_t *) PC) [24 ... 5] = (((GP+GD) & ~0xfff) - (PC & ~0xfff)) [31 ... 12]+`

|98
|R_LARCH_TLS_GD_HI20
|TLS GD 符号 GOT 表项 32/64 位绝对地址的 [31 ... 12] 位
|`+(*(uint32_t *) PC) [24 ... 5] = (GP+IE) [31 ... 12]+`

|99
|R_LARCH_32_PCREL
|32 位相对 PC 偏移
|`+(*(uint32_t *) PC) = (S+A-PC) [31 ... 0]+`

|100
|R_LARCH_RELAX
|在相同的地址和其它重定位成对使用,标识指令可能被修改或删除(relaxed)。
|
|===


Expand Down
Loading