在 2022/9/4 上午12:55, Fangrui Song 写道: > On Sat, Sep 3, 2022 at 1:43 AM liuzhensong wrote: >> Patch for branch 2.39. >> Need to reduce the address of pc when using >> reloction R_LARCH_SOP_PUSH_PCREL. >> >> bfd/ >> * elfnn-loongarch.c >> --- >> bfd/elfnn-loongarch.c | 3 +- >> ld/testsuite/ld-loongarch-elf/pcrel-const.d | 14 +++++++ >> ld/testsuite/ld-loongarch-elf/pcrel-const.lds | 14 +++++++ >> ld/testsuite/ld-loongarch-elf/pcrel-const.s | 12 ++++++ >> ld/testsuite/ld-loongarch-elf/pr.exp | 39 +++++++++++++++++++ >> 5 files changed, 81 insertions(+), 1 deletion(-) >> create mode 100644 ld/testsuite/ld-loongarch-elf/pcrel-const.d >> create mode 100644 ld/testsuite/ld-loongarch-elf/pcrel-const.lds >> create mode 100644 ld/testsuite/ld-loongarch-elf/pcrel-const.s >> create mode 100644 ld/testsuite/ld-loongarch-elf/pr.exp >> >> diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c >> index 5b44901b9e0..fafdc7c7458 100644 >> --- a/bfd/elfnn-loongarch.c >> +++ b/bfd/elfnn-loongarch.c >> @@ -2341,9 +2341,10 @@ loongarch_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, >> case R_LARCH_SOP_PUSH_PLT_PCREL: >> unresolved_reloc = false; >> >> - if (resolved_to_const) >> + if (!is_undefweak && resolved_to_const) >> { >> relocation += rel->r_addend; >> + relocation -= pc; >> break; >> } >> else if (is_undefweak) >> diff --git a/ld/testsuite/ld-loongarch-elf/pcrel-const.d b/ld/testsuite/ld-loongarch-elf/pcrel-const.d >> new file mode 100644 >> index 00000000000..ae4705aa531 >> --- /dev/null >> +++ b/ld/testsuite/ld-loongarch-elf/pcrel-const.d >> @@ -0,0 +1,14 @@ >> +#as: -mla-global-with-pcrel >> +#objdump: -Drsz >> + >> +.*:[ ]+file format .* >> + >> + >> +Disassembly of section .text: >> + >> +.* : >> +#... >> +[ ]+8:[ ]+02c04084[ ]+addi.d[ ]+\$a0,[ ]+\$a0,[ ]+16\(0x10\) >> +#... >> +0+14 <__sec_end>: >> +#pass >> diff --git a/ld/testsuite/ld-loongarch-elf/pcrel-const.lds b/ld/testsuite/ld-loongarch-elf/pcrel-const.lds >> new file mode 100644 >> index 00000000000..34b9861f4fa >> --- /dev/null >> +++ b/ld/testsuite/ld-loongarch-elf/pcrel-const.lds >> @@ -0,0 +1,14 @@ >> +ENTRY(foo); >> +SECTIONS >> +{ >> + .text : { >> + *(.text*) >> + } >> + >> + .data : { >> + __sec_start = .; >> + *(.gzdata) >> + __sec_end = .; >> + } >> +} >> +PROVIDE(__sec_size = __sec_end); > __sec_size is now the address of __sec_end instead of a size. Is this > intentional? __sec_size is not just the size of .gzdata, but a symbol represents some addresses. > >> diff --git a/ld/testsuite/ld-loongarch-elf/pcrel-const.s b/ld/testsuite/ld-loongarch-elf/pcrel-const.s >> new file mode 100644 >> index 00000000000..8b4a9d7aea0 >> --- /dev/null >> +++ b/ld/testsuite/ld-loongarch-elf/pcrel-const.s >> @@ -0,0 +1,12 @@ >> + .text >> + .align 2 >> + .globl foo >> + .type foo, @function >> +foo: >> + nop >> + la.global $r4,__sec_size >> + ldptr.w $r4,$r4,0 >> + jr $r1 >> + .size foo, .-foo >> + .data >> + .word 1 >> diff --git a/ld/testsuite/ld-loongarch-elf/pr.exp b/ld/testsuite/ld-loongarch-elf/pr.exp >> new file mode 100644 >> index 00000000000..c0cc2fc30d2 >> --- /dev/null >> +++ b/ld/testsuite/ld-loongarch-elf/pr.exp >> @@ -0,0 +1,39 @@ >> +# Expect script for LoongArch ELF linker tests >> +# Copyright (C) 2022 Free Software Foundation, Inc. >> +# >> +# This file is part of the GNU Binutils. >> +# >> +# This program is free software; you can redistribute it and/or modify >> +# it under the terms of the GNU General Public License as published by >> +# the Free Software Foundation; either version 3 of the License, or >> +# (at your option) any later version. >> +# >> +# This program is distributed in the hope that it will be useful, >> +# but WITHOUT ANY WARRANTY; without even the implied warranty of >> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> +# GNU General Public License for more details. >> +# >> +# You should have received a copy of the GNU General Public License >> +# along with this program; if not, write to the Free Software >> +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, >> +# MA 02110-1301, USA. >> +# >> + >> +if ![istarget loongarch64-*-*] { >> + return >> +} >> + >> +set link_tests [list \ >> + [list \ >> + "pcrel const" \ >> + "-T pcrel-const.lds" "" \ >> + "-mla-global-with-pcrel" \ >> + { pcrel-const.s } \ >> + [list \ >> + [list objdump -D pcrel-const.d] \ >> + ] \ >> + "pcrel-const" \ >> + ] \ >> +] >> + >> +run_ld_link_tests $link_tests >> -- >> 2.31.1 >> >