mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-05 15:15:42 +00:00
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:
@@ -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;
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user