mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-03 15:23:53 +08:00
bfd/elfnn-aarch64.c: Handle static links with ifunc correctly.
The code for handling GOT references to ifunc symbols in static links was missing. bfd/ChangeLog: 2013-11-26 Will Newton <will.newton@linaro.org> * elfnn-aarch64.c (elfNN_aarch64_finish_dynamic_symbol): Handle STT_GNU_IFUNC symbols correctly in static links. ld/testsuite/ChangeLog: 2013-11-26 Will Newton <will.newton@linaro.org> * ld-aarch64/aarch64-elf.exp: Add ifunc-22. * ld-aarch64/ifunc-22.d: New file. * ld-aarch64/ifunc-22.s: Likewise.
This commit is contained in:
parent
b1ee0cc489
commit
4920638856
@ -1,3 +1,8 @@
|
||||
2013-11-26 Will Newton <will.newton@linaro.org>
|
||||
|
||||
* elfnn-aarch64.c (elfNN_aarch64_finish_dynamic_symbol):
|
||||
Handle STT_GNU_IFUNC symbols correctly in static links.
|
||||
|
||||
2013-11-26 Will Newton <will.newton@linaro.org>
|
||||
|
||||
* elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Ensure
|
||||
|
@ -6824,7 +6824,34 @@ elfNN_aarch64_finish_dynamic_symbol (bfd *output_bfd,
|
||||
+ htab->root.sgot->output_offset
|
||||
+ (h->got.offset & ~(bfd_vma) 1));
|
||||
|
||||
if (info->shared && SYMBOL_REFERENCES_LOCAL (info, h))
|
||||
if (h->def_regular
|
||||
&& h->type == STT_GNU_IFUNC)
|
||||
{
|
||||
if (info->shared)
|
||||
{
|
||||
/* Generate R_AARCH64_GLOB_DAT. */
|
||||
goto do_glob_dat;
|
||||
}
|
||||
else
|
||||
{
|
||||
asection *plt;
|
||||
|
||||
if (!h->pointer_equality_needed)
|
||||
abort ();
|
||||
|
||||
/* For non-shared object, we can't use .got.plt, which
|
||||
contains the real function address if we need pointer
|
||||
equality. We load the GOT entry with the PLT entry. */
|
||||
plt = htab->root.splt ? htab->root.splt : htab->root.iplt;
|
||||
bfd_put_NN (output_bfd, (plt->output_section->vma
|
||||
+ plt->output_offset
|
||||
+ h->plt.offset),
|
||||
htab->root.sgot->contents
|
||||
+ (h->got.offset & ~(bfd_vma) 1));
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
else if (info->shared && SYMBOL_REFERENCES_LOCAL (info, h))
|
||||
{
|
||||
if (!h->def_regular)
|
||||
return FALSE;
|
||||
@ -6837,6 +6864,7 @@ elfNN_aarch64_finish_dynamic_symbol (bfd *output_bfd,
|
||||
}
|
||||
else
|
||||
{
|
||||
do_glob_dat:
|
||||
BFD_ASSERT ((h->got.offset & 1) == 0);
|
||||
bfd_put_NN (output_bfd, (bfd_vma) 0,
|
||||
htab->root.sgot->contents + h->got.offset);
|
||||
|
@ -1,3 +1,9 @@
|
||||
2013-11-26 Will Newton <will.newton@linaro.org>
|
||||
|
||||
* ld-aarch64/aarch64-elf.exp: Add ifunc-22.
|
||||
* ld-aarch64/ifunc-22.d: New file.
|
||||
* ld-aarch64/ifunc-22.s: Likewise.
|
||||
|
||||
2013-11-26 Will Newton <will.newton@linaro.org>
|
||||
|
||||
* ld-aarch64/aarch64-elf.exp: Add ifunc-21 test.
|
||||
|
@ -156,3 +156,4 @@ run_dump_test "ifunc-19a"
|
||||
run_dump_test "ifunc-19b"
|
||||
run_dump_test "ifunc-20"
|
||||
run_dump_test "ifunc-21"
|
||||
run_dump_test "ifunc-22"
|
||||
|
11
ld/testsuite/ld-aarch64/ifunc-22.d
Normal file
11
ld/testsuite/ld-aarch64/ifunc-22.d
Normal file
@ -0,0 +1,11 @@
|
||||
#source: ifunc-22.s
|
||||
#objdump: -s -j .got
|
||||
#ld: -static
|
||||
#target: aarch64*-*-*
|
||||
|
||||
# Ensure GOT is populated correctly in static link
|
||||
|
||||
.*: file format elf64-(little|big)aarch64
|
||||
|
||||
Contents of section \.got:
|
||||
4100f0 00000000 00000000 d0004000 00000000 ..........@.....
|
14
ld/testsuite/ld-aarch64/ifunc-22.s
Normal file
14
ld/testsuite/ld-aarch64/ifunc-22.s
Normal file
@ -0,0 +1,14 @@
|
||||
.text
|
||||
.type ifunc, @gnu_indirect_function
|
||||
.global ifunc
|
||||
ifunc:
|
||||
ret
|
||||
.size ifunc, .-ifunc
|
||||
.type _start, @function
|
||||
.globl _start
|
||||
_start:
|
||||
adrp x0, :got:ifunc
|
||||
ldr x0, [x0, #:got_lo12:ifunc]
|
||||
.size _start, .-_start
|
||||
.data
|
||||
.xword ifunc
|
Loading…
Reference in New Issue
Block a user