forked from wangliu-iscas/binutils-gdb
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
RISC-V: Clarify link behaviors of R_RISCV_32/64 relocations with ABS …
…symbol. There are two improvements, which are all referenced to aarch64, * R_RISCV_32 with non ABS symbol cannot be used under RV64 when making shard objects. * Don't need dynamic relocation for R_RISCV_32/64 under RV32/RV64 when making shared objects, if the referenced symbol is local ABS symbol. However, considering this link, riscv-non-isa/riscv-elf-psabi-doc#341 Seems like we should makes all R_RISCV_32/64 relocs with ABS symbol that don't need any dynamic relocations when making the shared objects. But anyway, I just sync the current behavior as aarch64 ld, in case there are any unexpected behaviors happen. Passed the gcc/binutils regressions in riscv-gnu-toolchain. bfd/ * elfnn-riscv.c (riscv_elf_check_relocs): Only allow R_RISCV_32 with ABS symbol under RV64. (riscv_elf_relocate_section): R_RISCV_32/64 with local ABS symbol under RV32/RV64 doesn't need any dynamic relocation when making shared objects. I just make the implementations similar to other targets, so that will be more easy to mainatain. ld/ * testsuite/ld-riscv-elf/data-reloc*: New testcases. * testsuite/ld-riscv-elf/ld-riscv-elf.exp: Added new data-reloc* testcases, and need to make ifunc-seperate* testcases work for rv32. * testsuite/ld-riscv-elf/ifunc-seperate-caller-nonplt.s: Likewise. * testsuite/ld-riscv-elf/ifunc-seperate-caller-plt.s: Likewise.
- Loading branch information
1 parent
9237688
commit 3785783
Showing
14 changed files
with
228 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
#source: data-reloc.s | ||
#as: -march=rv32i -mabi=ilp32 -defsym __abs__=1 -defsym __addr__=1 -defsym __undef__=1 | ||
#ld: -m[riscv_choose_ilp32_emul] -Ttext 0x8000 --defsym _start=0x0 --defsym abs=0x100 --defsym abs_local=0x200 -shared | ||
#objdump: -dR | ||
|
||
.*:[ ]+file format .* | ||
|
||
|
||
Disassembly of section .text: | ||
|
||
0+8000 <addr_globl>: | ||
8000: 00000000 .word 0x00000000 | ||
8000: R_RISCV_32 addr_globl | ||
|
||
0+8004 <addr_local>: | ||
... | ||
8004: R_RISCV_RELATIVE \*ABS\*\+0x8004 | ||
8008: R_RISCV_32 abs | ||
800c: 00000200 .word 0x00000200 | ||
8010: 00000000 .word 0x00000000 | ||
8010: R_RISCV_32 undef |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
#source: data-reloc.s | ||
#as: -march=rv32i -mabi=ilp32 -defsym __abs__=1 -defsym __addr__=1 | ||
#ld: -m[riscv_choose_ilp32_emul] -Ttext 0x8000 --defsym _start=0x0 --defsym abs=0x100 --defsym abs_local=0x200 -pie | ||
#objdump: -dR | ||
|
||
.*:[ ]+file format .* | ||
|
||
Disassembly of section .text: | ||
|
||
0+8000 <addr_globl>: | ||
8000: 00000000 .word 0x00000000 | ||
8000: R_RISCV_RELATIVE \*ABS\*\+0x8000 | ||
|
||
0+8004 <addr_local>: | ||
8004: 00000000 .word 0x00000000 | ||
8004: R_RISCV_RELATIVE \*ABS\*\+0x8004 | ||
8008: 00000100 .word 0x00000100 | ||
800c: 00000200 .word 0x00000200 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
#source: data-reloc.s | ||
#as: -march=rv32i -mabi=ilp32 -defsym __abs__=1 -defsym __addr__=1 -defsym __undef__=1 | ||
#ld: -m[riscv_choose_ilp32_emul] -Ttext 0x8000 --defsym _start=0x0 --defsym abs=0x100 --defsym abs_local=0x200 -shared -Bsymbolic | ||
#objdump: -dR | ||
|
||
.*:[ ]+file format .* | ||
|
||
|
||
Disassembly of section .text: | ||
|
||
0+8000 <addr_globl>: | ||
8000: 00000000 .word 0x00000000 | ||
8000: R_RISCV_RELATIVE \*ABS\*\+0x8000 | ||
|
||
0+8004 <addr_local>: | ||
... | ||
8004: R_RISCV_RELATIVE \*ABS\*\+0x8004 | ||
8008: R_RISCV_RELATIVE \*ABS\*\+0x100 | ||
800c: 00000200 .word 0x00000200 | ||
8010: 00000000 .word 0x00000000 | ||
8010: R_RISCV_32 undef |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
#source: data-reloc.s | ||
#as: -march=rv64i -mabi=lp64 -defsym __abs__=1 | ||
#ld: -m[riscv_choose_lp64_emul] -Ttext 0x8000 --defsym _start=0x0 --defsym abs=0x100 --defsym abs_local=0x200 -shared | ||
#objdump: -dR | ||
|
||
.*:[ ]+file format .* | ||
|
||
|
||
Disassembly of section .text: | ||
|
||
0+8000 <.text>: | ||
8000: 00000100 .word 0x00000100 | ||
8004: 00000200 .word 0x00000200 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
#source: data-reloc.s | ||
#as: -march=rv64i -mabi=lp64 -defsym __addr__=1 | ||
#ld: -m[riscv_choose_lp64_emul] -Ttext 0x8000 --defsym _start=0x0 -shared | ||
#error: .*relocation R_RISCV_32 against `addr_globl' can not be used in RV64 when making a shared object.* |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
#source: data-reloc.s | ||
#as: -march=rv64i -mabi=lp64 -defsym __64_bit__=1 -defsym __abs__=1 -defsym __addr__=1 -defsym __undef__=1 | ||
#ld: -m[riscv_choose_lp64_emul] -Ttext 0x8000 --defsym _start=0x0 --defsym abs=0x100 --defsym abs_local=0x200 -shared | ||
#objdump: -dR | ||
|
||
.*:[ ]+file format .* | ||
|
||
|
||
Disassembly of section .text: | ||
|
||
0+8000 <addr_globl>: | ||
... | ||
8000: R_RISCV_64 addr_globl | ||
|
||
0+8008 <addr_local>: | ||
... | ||
8008: R_RISCV_RELATIVE \*ABS\*\+0x8008 | ||
8010: R_RISCV_64 abs | ||
8018: 00000200 .word 0x00000200 | ||
... | ||
8020: R_RISCV_64 undef |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
#source: data-reloc.s | ||
#as: -march=rv64i -mabi=lp64 -defsym __64_bit__=1 -defsym __abs__=1 -defsym __addr__=1 | ||
#ld: -m[riscv_choose_lp64_emul] -Ttext 0x8000 --defsym _start=0x0 --defsym abs=0x100 --defsym abs_local=0x200 -pie | ||
#objdump: -dR | ||
|
||
.*:[ ]+file format .* | ||
|
||
|
||
Disassembly of section .text: | ||
|
||
0+8000 <addr_globl>: | ||
... | ||
8000: R_RISCV_RELATIVE \*ABS\*\+0x8000 | ||
|
||
0+8008 <addr_local>: | ||
... | ||
8008: R_RISCV_RELATIVE \*ABS\*\+0x8008 | ||
8010: 00000100 .word 0x00000100 | ||
8014: 00000000 .word 0x00000000 | ||
8018: 00000200 .word 0x00000200 | ||
801c: 00000000 .word 0x00000000 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
#source: data-reloc.s | ||
#as: -march=rv64i -mabi=lp64 -defsym __64_bit__=1 -defsym __abs__=1 -defsym __addr__=1 -defsym __undef__=1 | ||
#ld: -m[riscv_choose_lp64_emul] -Ttext 0x8000 --defsym _start=0x0 --defsym abs=0x100 --defsym abs_local=0x200 -shared -Bsymbolic | ||
#objdump: -dR | ||
|
||
.*:[ ]+file format .* | ||
|
||
|
||
Disassembly of section .text: | ||
|
||
0+8000 <addr_globl>: | ||
... | ||
8000: R_RISCV_RELATIVE \*ABS\*\+0x8000 | ||
|
||
0+8008 <addr_local>: | ||
... | ||
8008: R_RISCV_RELATIVE \*ABS\*\+0x8008 | ||
8010: R_RISCV_RELATIVE \*ABS\*\+0x100 | ||
8018: 00000200 .word 0x00000200 | ||
... | ||
8020: R_RISCV_64 undef |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
#source: data-reloc.s | ||
#as: -march=rv64i -mabi=lp64 -defsym __undef__=1 | ||
#ld: -m[riscv_choose_lp64_emul] -Ttext 0x8000 --defsym _start=0x0 -shared | ||
#error: .*relocation R_RISCV_32 against `undef' can not be used in RV64 when making a shared object.* |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
.macro DATA symbol | ||
.ifdef __64_bit__ | ||
.quad \symbol | ||
.else | ||
.word \symbol | ||
.endif | ||
.endm | ||
.ifdef __addr__ | ||
.globl addr_globl | ||
addr_globl: | ||
DATA addr_globl | ||
addr_local: | ||
DATA addr_local | ||
.endif | ||
.ifdef __abs__ | ||
.hidden abs_local | ||
DATA abs | ||
DATA abs_local | ||
.endif | ||
.ifdef __undef__ | ||
DATA undef | ||
.endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -20,4 +20,4 @@ main: | |
|
||
.data | ||
foo_addr: | ||
.long foo | ||
.quad foo |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -23,4 +23,4 @@ main: | |
|
||
.data | ||
foo_addr: | ||
.long foo | ||
.quad foo |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters