x86: Treat relocation against IFUNC symbol as FUNC
When resolving a relocation against IFUNC symbol in a SHT_NOTE section without SHF_ALLOC, we treat it as relocation against FUNC symbol since it needs the address of IFUNC symbol, not the address returned by IFUNC function. bfd/ PR ld/22929 * elf32-i386.c (elf_i386_relocate_section): Treat relocation against IFUNC symbol in SHT_NOTE section without SHF_ALLOC as relocation against FUNC symbol. * elf64-x86-64.c (elf_x86_64_relocate_section): Likewise. ld/ PR ld/22929 * testsuite/ld-i386/i386.exp: Run PR ld/22929 test. * testsuite/ld-x86-64/x86-64.exp: Likewise. * testsuite/ld-i386/pr22929.d: New file. * testsuite/ld-i386/pr22929.s: Likewise. * testsuite/ld-x86-64/pr22929.d: Likewise. * testsuite/ld-x86-64/pr22929.s: Likewise.
This commit is contained in:
parent
bd5dea8822
commit
347a87745e
|
@ -1,3 +1,11 @@
|
|||
2018-03-08 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR ld/22929
|
||||
* elf32-i386.c (elf_i386_relocate_section): Treat relocation
|
||||
against IFUNC symbol in SHT_NOTE section without SHF_ALLOC as
|
||||
relocation against FUNC symbol.
|
||||
* elf64-x86-64.c (elf_x86_64_relocate_section): Likewise.
|
||||
|
||||
2018-03-07 Renlin Li <renlin.li@arm.com>
|
||||
|
||||
PR ld/20402
|
||||
|
|
|
@ -2221,6 +2221,10 @@ elf_i386_relocate_section (bfd *output_bfd,
|
|||
|
||||
if ((input_section->flags & SEC_ALLOC) == 0)
|
||||
{
|
||||
/* If this is a SHT_NOTE section without SHF_ALLOC, treat
|
||||
STT_GNU_IFUNC symbol as STT_FUNC. */
|
||||
if (elf_section_type (input_section) == SHT_NOTE)
|
||||
goto skip_ifunc;
|
||||
/* Dynamic relocs are not propagated for SEC_DEBUGGING
|
||||
sections because such sections are not SEC_ALLOC and
|
||||
thus ld.so will not process them. */
|
||||
|
@ -2440,6 +2444,7 @@ do_ifunc_pointer:
|
|||
}
|
||||
}
|
||||
|
||||
skip_ifunc:
|
||||
resolved_to_zero = (eh != NULL
|
||||
&& UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh));
|
||||
|
||||
|
|
|
@ -2503,6 +2503,10 @@ elf_x86_64_relocate_section (bfd *output_bfd,
|
|||
|
||||
if ((input_section->flags & SEC_ALLOC) == 0)
|
||||
{
|
||||
/* If this is a SHT_NOTE section without SHF_ALLOC, treat
|
||||
STT_GNU_IFUNC symbol as STT_FUNC. */
|
||||
if (elf_section_type (input_section) == SHT_NOTE)
|
||||
goto skip_ifunc;
|
||||
/* Dynamic relocs are not propagated for SEC_DEBUGGING
|
||||
sections because such sections are not SEC_ALLOC and
|
||||
thus ld.so will not process them. */
|
||||
|
@ -2726,6 +2730,7 @@ do_ifunc_pointer:
|
|||
}
|
||||
}
|
||||
|
||||
skip_ifunc:
|
||||
resolved_to_zero = (eh != NULL
|
||||
&& UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh));
|
||||
|
||||
|
|
10
ld/ChangeLog
10
ld/ChangeLog
|
@ -1,3 +1,13 @@
|
|||
2018-03-08 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR ld/22929
|
||||
* testsuite/ld-i386/i386.exp: Run PR ld/22929 test.
|
||||
* testsuite/ld-x86-64/x86-64.exp: Likewise.
|
||||
* testsuite/ld-i386/pr22929.d: New file.
|
||||
* testsuite/ld-i386/pr22929.s: Likewise.
|
||||
* testsuite/ld-x86-64/pr22929.d: Likewise.
|
||||
* testsuite/ld-x86-64/pr22929.s: Likewise.
|
||||
|
||||
2018-03-07 Max Filippov <jcmvbkbc@gmail.com>
|
||||
|
||||
* emulparams/elf32xtensa.sh (COMMONPAGESIZE): Define.
|
||||
|
|
|
@ -459,6 +459,7 @@ run_dump_test "pr22115-1c"
|
|||
run_dump_test "pr22115-1d"
|
||||
run_dump_test "pr22135"
|
||||
run_dump_test "pr22782"
|
||||
run_dump_test "pr22929"
|
||||
|
||||
if { !([istarget "i?86-*-linux*"]
|
||||
|| [istarget "i?86-*-gnu*"]
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
#as: --32
|
||||
#ld: -melf_i386 -shared
|
||||
#readelf: -r --wide -s
|
||||
|
||||
There are no relocations in this file.
|
||||
#...
|
||||
Symbol table '.symtab' contains [0-9]+ entries:
|
||||
Num: Value Size Type Bind Vis Ndx Name
|
||||
#...
|
||||
[ \t]+[a-f0-9]+: [a-f0-9]+ +1 IFUNC +GLOBAL DEFAULT +[a-f0-9]+ +foo
|
||||
#...
|
|
@ -0,0 +1,21 @@
|
|||
.text
|
||||
.globl foo
|
||||
.type foo, %gnu_indirect_function
|
||||
foo:
|
||||
ret
|
||||
.size foo, .-foo
|
||||
.pushsection .gnu.build.attributes, "", %note
|
||||
.dc.l 6 # size of name
|
||||
.dc.l 16 # descsz = sizeof (addresses)
|
||||
.dc.l 0x101 # type = FUNC
|
||||
.dc.b 0x47, 0x41, 0x2a, 0x2, 0, 0 # name (numeric: -fstack-protector status)
|
||||
.dc.b 0, 0 # Padding
|
||||
.dc.a foo
|
||||
.dc.a foo_end # description (symbol name)
|
||||
.popsection
|
||||
|
||||
foo_end:
|
||||
.section .rodata.cst4,"aM",@progbits,4
|
||||
.align 4
|
||||
.LC0:
|
||||
.long 1065353216
|
|
@ -0,0 +1,11 @@
|
|||
#as: --64
|
||||
#ld: -melf_x86_64 -shared
|
||||
#readelf: -r --wide -s
|
||||
|
||||
There are no relocations in this file.
|
||||
#...
|
||||
Symbol table '.symtab' contains [0-9]+ entries:
|
||||
Num: Value Size Type Bind Vis Ndx Name
|
||||
#...
|
||||
[ \t]+[a-f0-9]+: [a-f0-9]+ +1 IFUNC +GLOBAL DEFAULT +[a-f0-9]+ +foo
|
||||
#...
|
|
@ -0,0 +1,21 @@
|
|||
.text
|
||||
.globl foo
|
||||
.type foo, %gnu_indirect_function
|
||||
foo:
|
||||
ret
|
||||
.size foo, .-foo
|
||||
.pushsection .gnu.build.attributes, "", %note
|
||||
.dc.l 6 # size of name
|
||||
.dc.l 16 # descsz = sizeof (addresses)
|
||||
.dc.l 0x101 # type = FUNC
|
||||
.dc.b 0x47, 0x41, 0x2a, 0x2, 0, 0 # name (numeric: -fstack-protector status)
|
||||
.dc.b 0, 0 # Padding
|
||||
.dc.a foo
|
||||
.dc.a foo_end # description (symbol name)
|
||||
.popsection
|
||||
|
||||
foo_end:
|
||||
.section .rodata.cst4,"aM",@progbits,4
|
||||
.align 4
|
||||
.LC0:
|
||||
.long 1065353216
|
|
@ -605,6 +605,7 @@ run_dump_test "pr20253-5a"
|
|||
run_dump_test "pr20253-5b"
|
||||
run_dump_test "tlsdesc2"
|
||||
run_dump_test "pr22048"
|
||||
run_dump_test "pr22929"
|
||||
|
||||
proc undefined_weak {cflags ldflags} {
|
||||
set testname "Undefined weak symbol"
|
||||
|
|
Loading…
Reference in New Issue