diff options
author | 2022-08-19 15:04:45 +0800 | |
---|---|---|
committer | 2022-10-08 18:12:07 +0800 | |
commit | 8a392b8120ab4497cb572f74f4a3b353309d84ba (patch) | |
tree | 2cc2779a3292d9ae573fe8e5aabc0dbd55154d00 | |
parent | LoongArch: gas: add support using constant variable in instructions. (diff) | |
download | binutils-gdb-8a392b8120ab4497cb572f74f4a3b353309d84ba.tar.gz binutils-gdb-8a392b8120ab4497cb572f74f4a3b353309d84ba.tar.bz2 binutils-gdb-8a392b8120ab4497cb572f74f4a3b353309d84ba.zip |
LoongArch: ld: Fix bug not generate plt when link a dso
Fix the bug that can not generate func@plt
when linking a undefined function with cmodel=medium.
Add testcase.
bfd/
* elfnn-loongarch.c
ld/testsuite/ld-loongarch-elf/
* cmodel-libjirl.dd
* cmodel.exp
* libjirl.s
(cherry picked from commit 42bd5254fb5f52f045796e1d9cce07102881d3b1)
-rw-r--r-- | bfd/elfnn-loongarch.c | 6 | ||||
-rw-r--r-- | ld/testsuite/ld-loongarch-elf/cmodel-libjirl.dd | 4 | ||||
-rw-r--r-- | ld/testsuite/ld-loongarch-elf/cmodel.exp | 37 | ||||
-rw-r--r-- | ld/testsuite/ld-loongarch-elf/libjirl.s | 2 |
4 files changed, 49 insertions, 0 deletions
diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c index 8d0f66ea7c1..ed42b8b6770 100644 --- a/bfd/elfnn-loongarch.c +++ b/bfd/elfnn-loongarch.c @@ -746,6 +746,12 @@ loongarch_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, case R_LARCH_PCALA_HI20: if (h != NULL) { + /* For pcalau12i + jirl. */ + h->needs_plt = 1; + if (h->plt.refcount < 0) + h->plt.refcount = 0; + h->plt.refcount++; + h->non_got_ref = 1; h->pointer_equality_needed = 1; } diff --git a/ld/testsuite/ld-loongarch-elf/cmodel-libjirl.dd b/ld/testsuite/ld-loongarch-elf/cmodel-libjirl.dd new file mode 100644 index 00000000000..52d3dca8443 --- /dev/null +++ b/ld/testsuite/ld-loongarch-elf/cmodel-libjirl.dd @@ -0,0 +1,4 @@ +.*file format.*loongarch +#... +[0-9a-f]+ <func@plt>: +#pass diff --git a/ld/testsuite/ld-loongarch-elf/cmodel.exp b/ld/testsuite/ld-loongarch-elf/cmodel.exp new file mode 100644 index 00000000000..7ef972a44e5 --- /dev/null +++ b/ld/testsuite/ld-loongarch-elf/cmodel.exp @@ -0,0 +1,37 @@ +# 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 loongarch*-*-*] { + return +} + +run_ld_link_tests [list \ + [list \ + "medium jirl plt" \ + "-shared" "" \ + "" \ + {libjirl.s} \ + [list \ + [list objdump -d cmodel-libjirl.dd] \ + ] \ + "libjirl.so" \ + ] \ + ] diff --git a/ld/testsuite/ld-loongarch-elf/libjirl.s b/ld/testsuite/ld-loongarch-elf/libjirl.s new file mode 100644 index 00000000000..4d963870df0 --- /dev/null +++ b/ld/testsuite/ld-loongarch-elf/libjirl.s @@ -0,0 +1,2 @@ +pcalau12i $r12, %pc_hi20(func) +jirl $r1,$r12, %pc_lo12(func) |