mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-06 12:09:26 +08:00
abd20cb637
I get the feedback recently that enable linker relaxations may fail to build some program. Consider the following case, .text foo: addi a0, a0, %pcrel_lo(.L2) call foo .L1: auipc a1, %pcrel_hi(data_g) addi a1, a1, %pcrel_lo(.L1) lui a2, %hi(data_g) addi a2, a2, %lo(data_g) lui a3, %tprel_hi(data_t) add a3, a3, tp, %tprel_add(data_t) addi a3, a3, %tprel_lo(data_t) .L2: auipc a0, %pcrel_hi(data_g) .data .word 0x0 .global data_g data_g: .word 0x1 .section .tbss data_t: .word 0x0 The current ld reports `dangerous relocation error` when doing the pcgp relaxation, test.o: in function `foo': (.text+0x0): dangerous relocation: %pcrel_lo missing matching %pcrel_hi The .L2 auipc should not be removed since it is behind the corresponding addi, so we record the information in the pcgp_relocs table to avoid removing the auipc later. But current ld still remove it since we do not update the pcgp_relocs table while doing other relaxations. I have two solutions to fix the problem, 1. Update the pcgp_relocs table once we actually delete the code. 2. Add new relax pass to do the pcgp relaxations At first I tried to do the first solution, and we need to update at least three information - hi_sec_off of riscv_pcgp_lo_reloc, hi_sec_off and hi_addr (symbol value) of riscv_pcgp_hi_reloc. Update the hi_sec_off is simple, but it is more complicate to update the symbol value, since we almost have to do parts the same works of _bfd_riscv_relax_call again in the riscv_relax_delete_bytes to get the correct symbol value. Compared with the first solution, the second one is more intuitive and simple. We add a new relax pass to do the pcgp relaxations later, so we will get all the information correctly in the _bfd_riscv_relax_call, including the symbol value, without changing so much code. I do not see any penalty by adding a new relax pass for now, so it should be fine to delay the pcgp relaxations. Besides, I have pass all riscv-gnu-toolchain regressions for this patch. bfd/ * elfnn-riscv.c (_bfd_riscv_relax_section): Add a new relax pass to do the pcgp relaxation later, after the lui and call relaxations, but before the delete and alignment relaxations. ld/ * emultempl/riscvelf.em (riscv_elf_before_allocation): Change link_info.relax_pass from 3 to 4. * testsuite/ld-riscv-elf/pcgp-relax.d: New testcase. * testsuite/ld-riscv-elf/pcgp-relax.s: Likewise. * testsuite/ld-riscv-elf/ld-riscv-elf.exp: Updated. |
||
---|---|---|
.. | ||
attr-merge-arch-01.d | ||
attr-merge-arch-01a.s | ||
attr-merge-arch-01b.s | ||
attr-merge-arch-02.d | ||
attr-merge-arch-02a.s | ||
attr-merge-arch-02b.s | ||
attr-merge-arch-03.d | ||
attr-merge-arch-03a.s | ||
attr-merge-arch-03b.s | ||
attr-merge-arch-failed-01.d | ||
attr-merge-arch-failed-01a.s | ||
attr-merge-arch-failed-01b.s | ||
attr-merge-arch-failed-02.d | ||
attr-merge-arch-failed-02a.s | ||
attr-merge-arch-failed-02b.s | ||
attr-merge-arch-failed-02c.s | ||
attr-merge-arch-failed-02d.s | ||
attr-merge-priv-spec-01.d | ||
attr-merge-priv-spec-02.d | ||
attr-merge-priv-spec-03.d | ||
attr-merge-priv-spec-a.s | ||
attr-merge-priv-spec-b.s | ||
attr-merge-priv-spec-c.s | ||
attr-merge-priv-spec-d.s | ||
attr-merge-priv-spec-failed-01.d | ||
attr-merge-priv-spec-failed-02.d | ||
attr-merge-priv-spec-failed-03.d | ||
attr-merge-priv-spec-failed-04.d | ||
attr-merge-priv-spec-failed-05.d | ||
attr-merge-priv-spec-failed-06.d | ||
attr-merge-stack-align-a.s | ||
attr-merge-stack-align-b.s | ||
attr-merge-stack-align-failed-a.s | ||
attr-merge-stack-align-failed-b.s | ||
attr-merge-stack-align-failed.d | ||
attr-merge-stack-align.d | ||
attr-merge-strict-align-01.d | ||
attr-merge-strict-align-01a.s | ||
attr-merge-strict-align-01b.s | ||
attr-merge-strict-align-02.d | ||
attr-merge-strict-align-02a.s | ||
attr-merge-strict-align-02b.s | ||
attr-merge-strict-align-03.d | ||
attr-merge-strict-align-03a.s | ||
attr-merge-strict-align-03b.s | ||
attr-merge-strict-align-04.d | ||
attr-merge-strict-align-04a.s | ||
attr-merge-strict-align-04b.s | ||
attr-merge-strict-align-05.d | ||
attr-merge-strict-align-05a.s | ||
attr-merge-strict-align-05b.s | ||
c-lui-2.d | ||
c-lui-2.ld | ||
c-lui-2.s | ||
c-lui.d | ||
c-lui.s | ||
call-relax-0.s | ||
call-relax-1.s | ||
call-relax-2.s | ||
call-relax-3.s | ||
call-relax.d | ||
disas-jalr.d | ||
disas-jalr.s | ||
gp-test-lib.sd | ||
gp-test.s | ||
gp-test.sd | ||
ifunc-nonplt-exe.rd | ||
ifunc-nonplt-pic.rd | ||
ifunc-nonplt-pie.rd | ||
ifunc-nonplt.d | ||
ifunc-nonplt.s | ||
ifunc-plt-01-exe.rd | ||
ifunc-plt-01-pic.rd | ||
ifunc-plt-01-pie.rd | ||
ifunc-plt-01.d | ||
ifunc-plt-01.s | ||
ifunc-plt-02-exe.rd | ||
ifunc-plt-02-pic.rd | ||
ifunc-plt-02-pie.rd | ||
ifunc-plt-02.d | ||
ifunc-plt-02.s | ||
ifunc-plt-got-overwrite-exe.rd | ||
ifunc-plt-got-overwrite-pic.rd | ||
ifunc-plt-got-overwrite-pie.rd | ||
ifunc-plt-got-overwrite.d | ||
ifunc-plt-got-overwrite.s | ||
ifunc-reloc-call-01-exe.rd | ||
ifunc-reloc-call-01-pic.rd | ||
ifunc-reloc-call-01-pie.rd | ||
ifunc-reloc-call-01.d | ||
ifunc-reloc-call-01.s | ||
ifunc-reloc-call-02-exe.rd | ||
ifunc-reloc-call-02-pic.rd | ||
ifunc-reloc-call-02-pie.rd | ||
ifunc-reloc-call-02.d | ||
ifunc-reloc-call-02.s | ||
ifunc-reloc-data-exe.rd | ||
ifunc-reloc-data-pic.rd | ||
ifunc-reloc-data-pie.rd | ||
ifunc-reloc-data.d | ||
ifunc-reloc-data.s | ||
ifunc-reloc-got-exe.rd | ||
ifunc-reloc-got-pic.rd | ||
ifunc-reloc-got-pie.rd | ||
ifunc-reloc-got.d | ||
ifunc-reloc-got.s | ||
ifunc-reloc-pcrel-exe.rd | ||
ifunc-reloc-pcrel-pic.rd | ||
ifunc-reloc-pcrel-pie.rd | ||
ifunc-reloc-pcrel.d | ||
ifunc-reloc-pcrel.s | ||
ifunc-seperate-caller-nonplt.s | ||
ifunc-seperate-caller-pcrel.s | ||
ifunc-seperate-caller-plt.s | ||
ifunc-seperate-nonplt-exe.d | ||
ifunc-seperate-nonplt-pic.d | ||
ifunc-seperate-nonplt-pie.d | ||
ifunc-seperate-pcrel-pic.d | ||
ifunc-seperate-pcrel-pie.d | ||
ifunc-seperate-plt-exe.d | ||
ifunc-seperate-plt-pic.d | ||
ifunc-seperate-plt-pie.d | ||
ifunc-seperate-resolver.s | ||
ld-riscv-elf.exp | ||
lib-nopic-01a.s | ||
lib-nopic-01b.d | ||
lib-nopic-01b.s | ||
pcgp-relax.d | ||
pcgp-relax.s | ||
pcrel-lo-addend-2.d | ||
pcrel-lo-addend-2.s | ||
pcrel-lo-addend.d | ||
pcrel-lo-addend.s | ||
weakref32.d | ||
weakref32.s | ||
weakref64.d | ||
weakref64.s | ||
weakref.ld |