From f678ded748f994a16e27fc3ac1d1c9451b98f608 Mon Sep 17 00:00:00 2001 From: Jiong Wang Date: Tue, 11 Aug 2015 21:55:52 +0100 Subject: [PATCH] [AArch64] Long branch veneer support far symbol defined by --defsym 2015-08-11 Jiong Wang 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. --- bfd/ChangeLog | 6 ++++++ bfd/elfnn-aarch64.c | 6 ++++-- ld/testsuite/ChangeLog | 7 +++++++ ld/testsuite/ld-aarch64/aarch64-elf.exp | 2 ++ 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index e2378fe3d0d..f4acd033838 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2015-08-11 Jiong Wang + + * 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 PR ld/18668 diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index 097a275990f..37fe1a655b5 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; diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 9b16f251f68..bb6ece69ca5 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2015-08-11 Jiong Wang + + * 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. + 2015-08-11 Jiong Wang * ld-aarch64/farcall-b-gsym.s: New test. diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp index b87b198596a..9554ea18643 100644 --- a/ld/testsuite/ld-aarch64/aarch64-elf.exp +++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp @@ -127,6 +127,8 @@ run_dump_test "limit-b" run_dump_test "limit-bl" run_dump_test "farcall-section" run_dump_test "farcall-back" +run_dump_test "farcall-b-defsym" +run_dump_test "farcall-bl-defsym" run_dump_test "farcall-b-gsym" run_dump_test "farcall-b-plt" run_dump_test "farcall-bl-plt" -- 2.30.2