[PATCH v2 2/8] RISC-V: Treat R_RISCV_CALL and R_RISCV_CALL_PLT as the same.
Nelson Chu
nelson.chu@sifive.com
Fri Aug 7 03:57:07 GMT 2020
bfd/
* elfnn-riscv.c (riscv_elf_check_relocs): Treat R_RISCV_CALL and
R_RISCV_CALL_PLT as the same in the riscv_elf_check_relocs.
(riscv_elf_relocate_section): Remove the R_RISCV_CALL for the
unresolved reloc checks.
ld/
testsuite/ld-riscv-elf/lib-nopic-01a.s: Use R_RISCV_JAL rather
than R_RISCV_CALL.
testsuite/ld-riscv-elf/lib-nopic-01b.d: Likewise.
testsuite/ld-riscv-elf/lib-nopic-01b.s: Likewise.
---
bfd/elfnn-riscv.c | 19 ++++++++++---------
ld/testsuite/ld-riscv-elf/lib-nopic-01a.s | 2 +-
ld/testsuite/ld-riscv-elf/lib-nopic-01b.d | 2 +-
ld/testsuite/ld-riscv-elf/lib-nopic-01b.s | 2 +-
4 files changed, 13 insertions(+), 12 deletions(-)
diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
index fee169c..94ee184 100644
--- a/bfd/elfnn-riscv.c
+++ b/bfd/elfnn-riscv.c
@@ -705,18 +705,21 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
return FALSE;
break;
+ case R_RISCV_CALL:
case R_RISCV_CALL_PLT:
- /* This symbol requires a procedure linkage table entry. We
+ /* These symbols require a procedure linkage table entry. We
actually build the entry in adjust_dynamic_symbol,
- because this might be a case of linking PIC code without
+ because these might be a case of linking PIC code without
linking in any dynamic objects, in which case we don't
need to generate a procedure linkage table after all. */
- if (h != NULL)
- {
- h->needs_plt = 1;
- h->plt.refcount += 1;
- }
+ /* If it is a local symbol, then we resolve it directly
+ without creating a PLT entry. */
+ if (h == NULL)
+ continue;
+
+ h->needs_plt = 1;
+ h->plt.refcount += 1;
break;
case R_RISCV_JAL:
@@ -728,7 +731,6 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
break;
goto static_reloc;
- case R_RISCV_CALL:
case R_RISCV_PCREL_HI20:
/* In shared libraries, these relocs are known to bind locally,
except IFUNC symbol. */
@@ -2669,7 +2671,6 @@ riscv_elf_relocate_section (bfd *output_bfd,
{
switch (r_type)
{
- case R_RISCV_CALL:
case R_RISCV_JAL:
case R_RISCV_RVC_JUMP:
if (asprintf (&msg_buf,
diff --git a/ld/testsuite/ld-riscv-elf/lib-nopic-01a.s b/ld/testsuite/ld-riscv-elf/lib-nopic-01a.s
index c95cda0..632875d 100644
--- a/ld/testsuite/ld-riscv-elf/lib-nopic-01a.s
+++ b/ld/testsuite/ld-riscv-elf/lib-nopic-01a.s
@@ -4,6 +4,6 @@
.globl func1
.type func1, @function
func1:
- call func2
+ jal func2
jr ra
.size func1, .-func1
diff --git a/ld/testsuite/ld-riscv-elf/lib-nopic-01b.d b/ld/testsuite/ld-riscv-elf/lib-nopic-01b.d
index 0d758a4..1c2c907 100644
--- a/ld/testsuite/ld-riscv-elf/lib-nopic-01b.d
+++ b/ld/testsuite/ld-riscv-elf/lib-nopic-01b.d
@@ -2,4 +2,4 @@
#source: lib-nopic-01b.s
#as:
#ld: -shared tmpdir/lib-nopic-01a.so
-#error: .*relocation R_RISCV_CALL against `func1' can not be used when making a shared object; recompile with -fPIC
+#error: .*relocation R_RISCV_JAL against `func1' can not be used when making a shared object; recompile with -fPIC
diff --git a/ld/testsuite/ld-riscv-elf/lib-nopic-01b.s b/ld/testsuite/ld-riscv-elf/lib-nopic-01b.s
index 97fe137..ea7b029 100644
--- a/ld/testsuite/ld-riscv-elf/lib-nopic-01b.s
+++ b/ld/testsuite/ld-riscv-elf/lib-nopic-01b.s
@@ -4,6 +4,6 @@
.globl func2
.type func2, @function
func2:
- call func1
+ jal func1
jr ra
.size func2, .-func2
--
2.7.4
More information about the Binutils
mailing list