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
This commit is contained in:
liuzhensong 2022-08-19 15:04:45 +08:00
parent 044193ebf6
commit 42bd5254fb
4 changed files with 49 additions and 0 deletions

View 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;
}

View File

@ -0,0 +1,4 @@
.*file format.*loongarch
#...
[0-9a-f]+ <func@plt>:
#pass

View File

@ -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" \
] \
]

View File

@ -0,0 +1,2 @@
pcalau12i $r12, %pc_hi20(func)
jirl $r1,$r12, %pc_lo12(func)