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

Commit

Permalink
Add new relocation type support
Browse files Browse the repository at this point in the history
  • Loading branch information
cloudspurs committed Jul 21, 2022
1 parent 9901663 commit 2800362
Show file tree
Hide file tree
Showing 2 changed files with 396 additions and 2 deletions.
199 changes: 198 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,203 @@ 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]+`

|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]+`

|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_LD_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

0 comments on commit 2800362

Please sign in to comment.