From 42bd5254fb5f52f045796e1d9cce07102881d3b1 Mon Sep 17 00:00:00 2001 From: liuzhensong Date: Fri, 19 Aug 2022 15:04:45 +0800 Subject: [PATCH] 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 --- bfd/elfnn-loongarch.c | 6 +++ .../ld-loongarch-elf/cmodel-libjirl.dd | 4 ++ ld/testsuite/ld-loongarch-elf/cmodel.exp | 37 +++++++++++++++++++ ld/testsuite/ld-loongarch-elf/libjirl.s | 2 + 4 files changed, 49 insertions(+) create mode 100644 ld/testsuite/ld-loongarch-elf/cmodel-libjirl.dd create mode 100644 ld/testsuite/ld-loongarch-elf/cmodel.exp create mode 100644 ld/testsuite/ld-loongarch-elf/libjirl.s 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]+ : +#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) -- 2.30.2