diff options
author | Nelson Chu <nelson@rivosinc.com> | 2023-12-20 10:37:41 +0800 |
---|---|---|
committer | Nelson Chu <nelson@rivosinc.com> | 2023-12-28 14:51:50 +0800 |
commit | 73d931e560059a87d76f528fafbb4270a98746bc (patch) | |
tree | 883363ffef6b021b3b1f78c7bee36dd5b6f1f095 /ld/testsuite | |
parent | 64e34e4134edb8a763ecfced808d2bb796796a15 (diff) | |
download | fsf-binutils-gdb-73d931e560059a87d76f528fafbb4270a98746bc.zip fsf-binutils-gdb-73d931e560059a87d76f528fafbb4270a98746bc.tar.gz fsf-binutils-gdb-73d931e560059a87d76f528fafbb4270a98746bc.tar.bz2 |
RISC-V: PR31179, The SET/ADD/SUB fix breaks ABI compatibility with 2.41 objects
* Problematic fix commit,
2029e13917d53d2289d3ebb390c4f40bd2112d21
RISC-V: Clarify the behaviors of SET/ADD/SUB relocations
* Bugzilla,
https://sourceware.org/bugzilla/show_bug.cgi?id=31179#c5
The addend of SUB_ULEB128 should be zero if using .uleb128, but we make it
non-zero by accident in assembler before. This causes troubles by applying
the above commit, since the calculation is changed to support .reloc *SUB*
relocations with non-zero addend.
We encourage people to rebuild their stuff to get the non-zero addend of
SUB_ULEB128, but that might need some times, so report warnings to inform
people need to rebuild their stuff if --check-uleb128 is enabled.
Since the failed .reloc cases for ADD/SET/SUB/ULEB128 are rarely to use,
it may acceptable that stop supproting them until people rebuld their stuff,
maybe half-year or a year later. Or maybe we should teach people that don't
write the .reloc R_RISCV_SUB* with non-zero constant, and then report
warnings/errors in assembler.
bfd/
* elfnn-riscv.c (perform_relocation): Ignore the non-zero addend of
R_RISCV_SUB_ULEB128.
(riscv_elf_relocate_section): Report warnings to inform people need
to rebuild their stuff if --check-uleb128 is enabled. So that can
get the right non-zero addend of R_RISCV_SUB_ULEB128.
* elfxx-riscv.h (struct riscv_elf_params): Added bool check_uleb128.
ld/
* NEWS: Updated.
* emultempl/riscvelf.em: Added linker risc-v target options,
--[no-]check-uleb128, to enable/disable checking if the addend of
uleb128 is non-zero or not. So that people will know they need to
rebuild the objects with binutils 2.42 and up, to get the right zero
addend of SUB_ULEB128 relocation, or they may get troubles if using
.reloc.
* ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp: Updated.
* ld/testsuite/ld-riscv-elf/pr31179*: New test cases.
Diffstat (limited to 'ld/testsuite')
-rw-r--r-- | ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-riscv-elf/pr31179-r.d | 10 | ||||
-rw-r--r-- | ld/testsuite/ld-riscv-elf/pr31179.d | 11 | ||||
-rw-r--r-- | ld/testsuite/ld-riscv-elf/pr31179.s | 13 |
4 files changed, 36 insertions, 0 deletions
diff --git a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp index 947a266..1d793da 100644 --- a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp +++ b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp @@ -173,6 +173,8 @@ if [istarget "riscv*-*-*"] { run_dump_test "attr-phdr" run_dump_test "relax-max-align-gp" run_dump_test "uleb128" + run_dump_test "pr31179" + run_dump_test "pr31179-r" run_ld_link_tests [list \ [list "Weak reference 32" "-T weakref.ld -m[riscv_choose_ilp32_emul]" "" \ "-march=rv32i -mabi=ilp32" {weakref32.s} \ diff --git a/ld/testsuite/ld-riscv-elf/pr31179-r.d b/ld/testsuite/ld-riscv-elf/pr31179-r.d new file mode 100644 index 0000000..cd5c98e --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/pr31179-r.d @@ -0,0 +1,10 @@ +#source: pr31179.s +#as: +#readelf: -Wr + +Relocation section '.rela.text' at .* +[ ]+Offset[ ]+Info[ ]+Type[ ]+.* +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_RISCV_SET_ULEB128[ ]+[0-9a-f]+[ ]+bar \+ 1 +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_RISCV_SUB_ULEB128[ ]+[0-9a-f]+[ ]+foo \+ 0 +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_RISCV_SET_ULEB128[ ]+[0-9a-f]+[ ]+bar \+ 1 +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_RISCV_SUB_ULEB128[ ]+[0-9a-f]+[ ]+foo \+ 1 diff --git a/ld/testsuite/ld-riscv-elf/pr31179.d b/ld/testsuite/ld-riscv-elf/pr31179.d new file mode 100644 index 0000000..a3228db --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/pr31179.d @@ -0,0 +1,11 @@ +#source: pr31179.s +#as: +#ld: --check-uleb128 +#objdump: -sj .text +#warning: .*R_RISCV_SUB_ULEB128 with non-zero addend, please rebuild by binutils 2.42 or up + +.*:[ ]+file format .* + +Contents of section .text: + +[ ]+[0-9a-f]+[ ]+00000303[ ]+.* diff --git a/ld/testsuite/ld-riscv-elf/pr31179.s b/ld/testsuite/ld-riscv-elf/pr31179.s new file mode 100644 index 0000000..5c4b4b5 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/pr31179.s @@ -0,0 +1,13 @@ +.globl _start +_start: + +foo: +.2byte 0 +bar: + +.uleb128 bar - foo + 1 + +reloc: +.reloc reloc, R_RISCV_SET_ULEB128, bar + 1 +.reloc reloc, R_RISCV_SUB_ULEB128, foo + 1 +.byte 0x0 |