RISC-V: Treat R_RISCV_CALL and R_RISCV_CALL_PLT as the same in check_relocs.

In fact, we can treate these two relocation as the same one in the
riscv_elf_check_relocs.  I have heard that RISC-V lld had made this
improvement, and so had GNU AARCH64, they only need R_AARCH64_CALL26
for calls rather than two seperate relocations.

Beside, the following PLT issue for RISC-V 32-bit glibc seems to be
fixed by applying at least this patch.

<https://sourceware.org/pipermail/libc-alpha/2020-August/117214.html>

I have ran the toolchain regression, and everything seems fine for now.

	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.
This commit is contained in:
Nelson Chu
2020-08-26 01:19:13 -07:00
parent f2f08254b1
commit 3b1450b38c
6 changed files with 27 additions and 12 deletions

View File

@ -1,3 +1,10 @@
2020-08-28 Nelson Chu <nelson.chu@sifive.com>
* 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.
2020-08-27 John David Anglin <danglin@gcc.gnu.org> 2020-08-27 John David Anglin <danglin@gcc.gnu.org>
PR 26356 PR 26356

View File

@ -557,21 +557,23 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
return FALSE; return FALSE;
break; break;
case R_RISCV_CALL:
case R_RISCV_CALL_PLT: case R_RISCV_CALL_PLT:
/* This symbol requires a procedure linkage table entry. We /* These symbol requires a procedure linkage table entry. We
actually build the entry in adjust_dynamic_symbol, 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 linking in any dynamic objects, in which case we don't
need to generate a procedure linkage table after all. */ need to generate a procedure linkage table after all. */
if (h != NULL) /* 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->needs_plt = 1;
h->plt.refcount += 1; h->plt.refcount += 1;
}
break; break;
case R_RISCV_CALL:
case R_RISCV_JAL: case R_RISCV_JAL:
case R_RISCV_BRANCH: case R_RISCV_BRANCH:
case R_RISCV_RVC_BRANCH: case R_RISCV_RVC_BRANCH:
@ -2189,7 +2191,6 @@ riscv_elf_relocate_section (bfd *output_bfd,
{ {
switch (r_type) switch (r_type)
{ {
case R_RISCV_CALL:
case R_RISCV_JAL: case R_RISCV_JAL:
case R_RISCV_RVC_JUMP: case R_RISCV_RVC_JUMP:
if (asprintf (&msg_buf, if (asprintf (&msg_buf,

View File

@ -1,3 +1,10 @@
2020-08-28 Nelson Chu <nelson.chu@sifive.com>
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.
2020-08-27 Jozef Lawrynowicz <jozef.l@mittosystems.com> 2020-08-27 Jozef Lawrynowicz <jozef.l@mittosystems.com>
* emultempl/msp430.em: Remove unused variable "buf". * emultempl/msp430.em: Remove unused variable "buf".

View File

@ -4,6 +4,6 @@
.globl func1 .globl func1
.type func1, @function .type func1, @function
func1: func1:
call func2 jal func2
jr ra jr ra
.size func1, .-func1 .size func1, .-func1

View File

@ -2,4 +2,4 @@
#source: lib-nopic-01b.s #source: lib-nopic-01b.s
#as: #as:
#ld: -shared tmpdir/lib-nopic-01a.so #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

View File

@ -4,6 +4,6 @@
.globl func2 .globl func2
.type func2, @function .type func2, @function
func2: func2:
call func1 jal func1
jr ra jr ra
.size func2, .-func2 .size func2, .-func2