i386: Don't allow GOTOFF relocation against IFUNC symbol for PIC

We can't use the PLT entry as the function address for PIC since the PIC
register may not be set up properly for indirect call.

bfd/

	PR ld/27998
	* elf32-i386.c (elf_i386_relocate_section): Don't allow GOTOFF
	relocation against IFUNC symbol for PIC.

ld/

	PR ld/27998
	* testsuite/ld-i386/pr27998a.d: Replace -shared with -e bar.
	* testsuite/ld-i386/pr27998b.d: Expect a linker error.
	* testsuite/ld-ifunc/ifunc-2-i386-now.d: Updated.
	* testsuite/ld-ifunc/ifunc-2-local-i386-now.d: Likewise.
	* testsuite/ld-ifunc/ifunc-2-i386.s: Replace @GOTOFF with @GOT.
	* testsuite/ld-ifunc/ifunc-2-local-i386.s: Likewise.
This commit is contained in:
H.J. Lu
2022-07-21 10:35:58 -07:00
parent c44885db3b
commit 8f29211c3f
7 changed files with 11 additions and 10 deletions

View File

@@ -2460,6 +2460,11 @@ elf_i386_relocate_section (bfd *output_bfd,
goto do_relocation;
case R_386_GOTOFF:
/* NB: We can't use the PLT entry as the function address
for PIC since the PIC register may not be set up
properly for indirect call. */
if (bfd_link_pic (info))
goto bad_ifunc_reloc;
relocation -= (gotplt->output_section->vma
+ gotplt->output_offset);
goto do_relocation;

View File

@@ -1,5 +1,5 @@
#as: --32
#ld: -shared -melf_i386
#ld: -e bar -melf_i386
#readelf: -r --wide
Relocation section '.rel.plt' at offset 0x[0-9a-f]+ contains 1 entry:

View File

@@ -1,7 +1,3 @@
#as: --32
#ld: -shared -melf_i386
#readelf: -r --wide
Relocation section '.rel.plt' at offset 0x[0-9a-f]+ contains 1 entry:
Offset Info Type Sym. Value Symbol's Name
[0-9a-f]+ +[0-9a-f]+ +R_386_IRELATIVE +
#error: relocation R_386_GOTOFF against STT_GNU_IFUNC symbol `foo' isn't supported

View File

@@ -31,6 +31,6 @@ Disassembly of section .text:
+[a-f0-9]+: 5b pop %ebx
+[a-f0-9]+: 81 c3 9e 10 00 00 add \$0x109e,%ebx
+[a-f0-9]+: e8 de ff ff ff call 100 <\*ABS\*@plt>
+[a-f0-9]+: 8d 83 4c ef ff ff lea -0x10b4\(%ebx\),%eax
+[a-f0-9]+: 8b 83 0c 00 00 00 mov 0xc\(%ebx\),%eax
+[a-f0-9]+: c3 ret
#pass

View File

@@ -16,6 +16,6 @@ bar:
popl %ebx
addl $_GLOBAL_OFFSET_TABLE_+[.-.L6], %ebx
call __GI_foo@PLT
leal __GI_foo@GOTOFF(%ebx), %eax
movl __GI_foo@GOT(%ebx), %eax
ret
.size bar, .-bar

View File

@@ -31,6 +31,6 @@ Disassembly of section .text:
+[a-f0-9]+: 5b pop %ebx
+[a-f0-9]+: 81 c3 9e 10 00 00 add \$0x109e,%ebx
+[a-f0-9]+: e8 de ff ff ff call f0 <\*ABS\*@plt>
+[a-f0-9]+: 8d 83 4c ef ff ff lea -0x10b4\(%ebx\),%eax
+[a-f0-9]+: 8b 83 0c 00 00 00 mov 0xc\(%ebx\),%eax
+[a-f0-9]+: c3 ret
#pass

View File

@@ -13,6 +13,6 @@ bar:
popl %ebx
addl $_GLOBAL_OFFSET_TABLE_+[.-.L6], %ebx
call __GI_foo@PLT
leal __GI_foo@GOTOFF(%ebx), %eax
movl __GI_foo@GOT(%ebx), %eax
ret
.size bar, .-bar