diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2022-07-21 10:35:58 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2022-07-21 11:40:27 -0700 |
commit | 8f29211c3f0a6335c17e0a90396c146facf6dba4 (patch) | |
tree | 5f38e50ea5188f6e4588ca968bec955c03a8e3b0 /ld | |
parent | c44885db3b56c83a12e88a176c03f2a2268428b8 (diff) | |
download | fsf-binutils-gdb-8f29211c3f0a6335c17e0a90396c146facf6dba4.zip fsf-binutils-gdb-8f29211c3f0a6335c17e0a90396c146facf6dba4.tar.gz fsf-binutils-gdb-8f29211c3f0a6335c17e0a90396c146facf6dba4.tar.bz2 |
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.
Diffstat (limited to 'ld')
-rw-r--r-- | ld/testsuite/ld-i386/pr27998a.d | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-i386/pr27998b.d | 6 | ||||
-rw-r--r-- | ld/testsuite/ld-ifunc/ifunc-2-i386-now.d | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-ifunc/ifunc-2-i386.s | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-ifunc/ifunc-2-local-i386-now.d | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-ifunc/ifunc-2-local-i386.s | 2 |
6 files changed, 6 insertions, 10 deletions
diff --git a/ld/testsuite/ld-i386/pr27998a.d b/ld/testsuite/ld-i386/pr27998a.d index ca3c920..a801973 100644 --- a/ld/testsuite/ld-i386/pr27998a.d +++ b/ld/testsuite/ld-i386/pr27998a.d @@ -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: diff --git a/ld/testsuite/ld-i386/pr27998b.d b/ld/testsuite/ld-i386/pr27998b.d index ca3c920..8f81edb 100644 --- a/ld/testsuite/ld-i386/pr27998b.d +++ b/ld/testsuite/ld-i386/pr27998b.d @@ -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 diff --git a/ld/testsuite/ld-ifunc/ifunc-2-i386-now.d b/ld/testsuite/ld-ifunc/ifunc-2-i386-now.d index a5c56b5..8d9e8dc 100644 --- a/ld/testsuite/ld-ifunc/ifunc-2-i386-now.d +++ b/ld/testsuite/ld-ifunc/ifunc-2-i386-now.d @@ -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 diff --git a/ld/testsuite/ld-ifunc/ifunc-2-i386.s b/ld/testsuite/ld-ifunc/ifunc-2-i386.s index e84d6b7..1acf684 100644 --- a/ld/testsuite/ld-ifunc/ifunc-2-i386.s +++ b/ld/testsuite/ld-ifunc/ifunc-2-i386.s @@ -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 diff --git a/ld/testsuite/ld-ifunc/ifunc-2-local-i386-now.d b/ld/testsuite/ld-ifunc/ifunc-2-local-i386-now.d index ff494de..9da37e5 100644 --- a/ld/testsuite/ld-ifunc/ifunc-2-local-i386-now.d +++ b/ld/testsuite/ld-ifunc/ifunc-2-local-i386-now.d @@ -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 diff --git a/ld/testsuite/ld-ifunc/ifunc-2-local-i386.s b/ld/testsuite/ld-ifunc/ifunc-2-local-i386.s index a69e060..54e0e17 100644 --- a/ld/testsuite/ld-ifunc/ifunc-2-local-i386.s +++ b/ld/testsuite/ld-ifunc/ifunc-2-local-i386.s @@ -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 |