123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- From 509a2ec6ad3ea7eb3f4cf59538cf636a2126e4c3 Mon Sep 17 00:00:00 2001
- From: liuzhensong <[email protected]>
- Date: Fri, 2 Sep 2022 16:29:14 +0800
- Subject: [PATCH 039/160] LoongArch:ld: Fix relocation error of pcrel.
- 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
- --- a/bfd/elfnn-loongarch.c
- +++ b/bfd/elfnn-loongarch.c
- @@ -2342,9 +2342,10 @@ loongarch_elf_relocate_section (bfd *out
- 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)
- --- /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:
- +
- +.* <foo>:
- +#...
- +[ ]+8:[ ]+02c04084[ ]+addi.d[ ]+\$a0,[ ]+\$a0,[ ]+16\(0x10\)
- +#...
- +0+14 <__sec_end>:
- +#pass
- --- /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);
- --- /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
- --- /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
|