LoongArch: ld: Fix bug not generate plt when link a dso
authorliuzhensong <liuzhensong@loongson.cn>
Fri, 19 Aug 2022 07:04:45 +0000 (15:04 +0800)
committerliuzhensong <liuzhensong@loongson.cn>
Wed, 24 Aug 2022 06:27:03 +0000 (14:27 +0800)
  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
ld/testsuite/ld-loongarch-elf/cmodel-libjirl.dd [new file with mode: 0644]
ld/testsuite/ld-loongarch-elf/cmodel.exp [new file with mode: 0644]
ld/testsuite/ld-loongarch-elf/libjirl.s [new file with mode: 0644]

index 8d0f66ea7c1b482fbac684818d560f17314b4bd1..ed42b8b6770de27fe382ff9e0e7331f9b0c10bae 100644 (file)
@@ -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 (file)
index 0000000..52d3dca
--- /dev/null
@@ -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 (file)
index 0000000..7ef972a
--- /dev/null
@@ -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 (file)
index 0000000..4d96387
--- /dev/null
@@ -0,0 +1,2 @@
+pcalau12i $r12, %pc_hi20(func)
+jirl $r1,$r12, %pc_lo12(func)