diff options
author | Jiong Wang <jiong.wang@arm.com> | 2015-08-11 21:55:52 +0100 |
---|---|---|
committer | Jiong Wang <jiong.wang@arm.com> | 2015-08-11 21:55:52 +0100 |
commit | f678ded748f994a16e27fc3ac1d1c9451b98f608 (patch) | |
tree | b11d639f6672535887d9ddeb9dadd01454dafb33 /bfd | |
parent | 07f9ddfeba5b572451471f905473f7ddbba1d472 (diff) | |
download | gdb-f678ded748f994a16e27fc3ac1d1c9451b98f608.zip gdb-f678ded748f994a16e27fc3ac1d1c9451b98f608.tar.gz gdb-f678ded748f994a16e27fc3ac1d1c9451b98f608.tar.bz2 |
[AArch64] Long branch veneer support far symbol defined by --defsym
2015-08-11 Jiong Wang <jiong.wang@arm.com>
bfd/
* bfd/elfnn-aarch64.c (aarch64_type_of_stub): New parameter "sym_sec".
Loose the check for symbol from ABS section.
(elfNN_aarch64_size_stubs): Pass sym_sec.
ld/testsuite/
* ld-aarch64/farcall-b-defsym.s: New test.
* ld-aarch64/farcall-bl-defsym.s: Likewise.
* ld-aarch64/farcall-b-defsym.d: New expectation.
* ld-aarch64/farcall-bl-defsym.d: Likewise.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/elfnn-aarch64.c | 6 |
2 files changed, 10 insertions, 2 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index e2378fe..f4acd03 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,11 @@ 2015-08-11 Jiong Wang <jiong.wang@arm.com> + * bfd/elfnn-aarch64.c (aarch64_type_of_stub): New parameter "sym_sec". + Loose the check for symbol from ABS section. + (elfNN_aarch64_size_stubs): Pass sym_sec. + +2015-08-11 Jiong Wang <jiong.wang@arm.com> + PR ld/18668 * elfnn-aarch64.c (aarch64_type_of_stub): Update destination for calls go through plt stub. diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index 097a275..37fe1a6 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -2316,6 +2316,7 @@ static enum elf_aarch64_stub_type aarch64_type_of_stub (struct bfd_link_info *info, asection *input_sec, const Elf_Internal_Rela *rel, + asection *sym_sec, unsigned char st_type, struct elf_aarch64_link_hash_entry *hash, bfd_vma destination) @@ -2327,7 +2328,8 @@ aarch64_type_of_stub (struct bfd_link_info *info, enum elf_aarch64_stub_type stub_type = aarch64_stub_none; bfd_boolean via_plt_p; - if (st_type != STT_FUNC) + if (st_type != STT_FUNC + && (sym_sec != bfd_abs_section_ptr)) return stub_type; globals = elf_aarch64_hash_table (info); @@ -3815,7 +3817,7 @@ elfNN_aarch64_size_stubs (bfd *output_bfd, /* Determine what (if any) linker stub is needed. */ stub_type = aarch64_type_of_stub - (info, section, irela, st_type, hash, destination); + (info, section, irela, sym_sec, st_type, hash, destination); if (stub_type == aarch64_stub_none) continue; |