From d68f19767dfbb33c1813563d5a4af0731a1855c5 Mon Sep 17 00:00:00 2001 From: Jiong Wang Date: Fri, 16 Jun 2017 14:20:38 +0100 Subject: [PATCH] [AArch64] Use SYMBOL_REFERENCES_LOCAL in one symbol check For some pc-relative relocations we want to allow them under PIC mode while a normal global symbol defined in the same dynamic object can still bind externally through copy relocation. So, we should not allow pc-relative relocation against such symbol. SYMBOL_REFERENCES_LOCAL should be used and is more accurate than the original individual checks. bfd/ * elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Use SYMBOL_REFERENCES_LOCAL. ld/ * testsuite/ld-aarch64/aarch64-elf.exp: Update test name * testsuite/ld-aarch64/pcrel.s: Add new testcases. * testsuite/ld-aarch64/pcrel_pic_undefined.d: Update the expected warnings. * testsuite/ld-aarch64/pcrel_pic_defined_local.d: Rename ... * testsuite/ld-aarch64/pcrel_pic_defined.d: ... to this. Update expected warnings. --- bfd/ChangeLog | 5 +++++ bfd/elfnn-aarch64.c | 8 ++++---- ld/ChangeLog | 10 ++++++++++ ld/testsuite/ld-aarch64/aarch64-elf.exp | 2 +- ld/testsuite/ld-aarch64/pcrel.s | 6 ++++++ ld/testsuite/ld-aarch64/pcrel_pic_defined.d | 10 ++++++++++ .../ld-aarch64/pcrel_pic_defined_local.d | 5 ----- ld/testsuite/ld-aarch64/pcrel_pic_undefined.d | 16 ++++++++-------- 8 files changed, 44 insertions(+), 18 deletions(-) create mode 100644 ld/testsuite/ld-aarch64/pcrel_pic_defined.d delete mode 100644 ld/testsuite/ld-aarch64/pcrel_pic_defined_local.d diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 879ced757a4..c7241babfeb 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2017-06-16 Jiong Wang + + * elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Use + SYMBOL_REFERENCES_LOCAL. + 2017-06-15 Jiong Wang PR ld/21532 diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index e27f067ce50..b61bb8aa5be 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -5329,15 +5329,15 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, if (bfd_link_pic (info) && (input_section->flags & SEC_ALLOC) != 0 && (input_section->flags & SEC_READONLY) != 0 - && h != NULL - && !h->def_regular) + && !SYMBOL_REFERENCES_LOCAL (info, h)) { int howto_index = bfd_r_type - BFD_RELOC_AARCH64_RELOC_START; _bfd_error_handler /* xgettext:c-format */ - (_("%B: relocation %s against external symbol `%s' can not be used" - " when making a shared object; recompile with -fPIC"), + (_("%B: relocation %s against symbol `%s' which may bind " + "externally can not be used when making a shared object; " + "recompile with -fPIC"), input_bfd, elfNN_aarch64_howto_table[howto_index].name, h->root.root.string); bfd_set_error (bfd_error_bad_value); diff --git a/ld/ChangeLog b/ld/ChangeLog index 7791c036076..751699d6733 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,13 @@ +2017-06-16 Jiong Wang + + * testsuite/ld-aarch64/aarch64-elf.exp: Update test name + * testsuite/ld-aarch64/pcrel.s: Add new testcases. + * testsuite/ld-aarch64/pcrel_pic_undefined.d: Update the expected + warnings. + * testsuite/ld-aarch64/pcrel_pic_defined_local.d: Rename ... + * testsuite/ld-aarch64/pcrel_pic_defined.d: ... to this. + Update expected warnings. + 2017-06-15 H.J. Lu * exsup.c (elf_shlib_list_options): Display "-z stack-size=SIZE" diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp index f171f6fe348..b9c9885cb42 100644 --- a/ld/testsuite/ld-aarch64/aarch64-elf.exp +++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp @@ -195,7 +195,7 @@ run_dump_test_lp64 "local-addend-r" # test error handling on pcrel relocation for shared libraries. run_dump_test_lp64 "pcrel_pic_undefined" -run_dump_test_lp64 "pcrel_pic_defined_local" +run_dump_test_lp64 "pcrel_pic_defined" run_dump_test "limit-b" run_dump_test "limit-bl" diff --git a/ld/testsuite/ld-aarch64/pcrel.s b/ld/testsuite/ld-aarch64/pcrel.s index df542ef5dee..c5e18d019e4 100644 --- a/ld/testsuite/ld-aarch64/pcrel.s +++ b/ld/testsuite/ld-aarch64/pcrel.s @@ -1,3 +1,4 @@ + .hidden global_b .text .align 2 main: @@ -18,3 +19,8 @@ main: .word global_a - . .xword global_a - . + # Defined global symbol may bind externally because of copy relocation, + # while defined hidden symbol binds locally. LD should be able to + # differenciate this. + adrp x0, :pg_hi21:global_b + .xword global_b - . diff --git a/ld/testsuite/ld-aarch64/pcrel_pic_defined.d b/ld/testsuite/ld-aarch64/pcrel_pic_defined.d new file mode 100644 index 00000000000..743e810b96f --- /dev/null +++ b/ld/testsuite/ld-aarch64/pcrel_pic_defined.d @@ -0,0 +1,10 @@ +#name: PC-Rel relocation against defined +#source: pcrel.s +#ld: -shared -e0 -defsym global_a=0x1000 -defsym global_b=0x2000 +#warning: .*: relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `global_a.*bind externally.*fPIC.* +#warning: .*: relocation R_AARCH64_ADR_PREL_PG_HI21_NC against symbol `global_a.*bind externally.*fPIC.* +#warning: .*: relocation R_AARCH64_ADR_PREL_LO21 against symbol `global_a.*bind externally.*fPIC.* +#warning: .*: relocation R_AARCH64_LD_PREL_LO19 against symbol `global_a.*bind externally.*fPIC.* +#warning: .*: relocation R_AARCH64_PREL16 against symbol `global_a.*bind externally.*fPIC.* +#warning: .*: relocation R_AARCH64_PREL32 against symbol `global_a.*bind externally.*fPIC.* +#warning: .*: relocation R_AARCH64_PREL64 against symbol `global_a.*bind externally.*fPIC.* diff --git a/ld/testsuite/ld-aarch64/pcrel_pic_defined_local.d b/ld/testsuite/ld-aarch64/pcrel_pic_defined_local.d deleted file mode 100644 index 832652fc9f6..00000000000 --- a/ld/testsuite/ld-aarch64/pcrel_pic_defined_local.d +++ /dev/null @@ -1,5 +0,0 @@ -#name: PC-Rel relocation against defined -#source: pcrel.s -#objdump: -r -#ld: -shared -e0 -defsym global_a=0x1000 -#... diff --git a/ld/testsuite/ld-aarch64/pcrel_pic_undefined.d b/ld/testsuite/ld-aarch64/pcrel_pic_undefined.d index de7f020eb4c..f7f048d9da6 100644 --- a/ld/testsuite/ld-aarch64/pcrel_pic_undefined.d +++ b/ld/testsuite/ld-aarch64/pcrel_pic_undefined.d @@ -1,10 +1,10 @@ #name: PC-Rel relocation against undefined #source: pcrel.s -#ld: -shared -e0 -#warning: .*: relocation R_AARCH64_ADR_PREL_PG_HI21 against external symbol.*fPIC.* -#warning: .*: relocation R_AARCH64_ADR_PREL_PG_HI21_NC against external symbol.*fPIC.* -#warning: .*: relocation R_AARCH64_ADR_PREL_LO21 against external symbol.*fPIC.* -#warning: .*: relocation R_AARCH64_LD_PREL_LO19 against external symbol.*fPIC.* -#warning: .*: relocation R_AARCH64_PREL16 against external symbol.*fPIC.* -#warning: .*: relocation R_AARCH64_PREL32 against external symbol.*fPIC.* -#warning: .*: relocation R_AARCH64_PREL64 against external symbol.*fPIC.* +#ld: -shared -e0 -defsym global_b=0x2000 +#warning: .*: relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `global_a.*bind externally.*fPIC.* +#warning: .*: relocation R_AARCH64_ADR_PREL_PG_HI21_NC against symbol `global_a.*bind externally.*fPIC.* +#warning: .*: relocation R_AARCH64_ADR_PREL_LO21 against symbol `global_a.*bind externally.*fPIC.* +#warning: .*: relocation R_AARCH64_LD_PREL_LO19 against symbol `global_a.*bind externally.*fPIC.* +#warning: .*: relocation R_AARCH64_PREL16 against symbol `global_a.*bind externally.*fPIC.* +#warning: .*: relocation R_AARCH64_PREL32 against symbol `global_a.*bind externally.*fPIC.* +#warning: .*: relocation R_AARCH64_PREL64 against symbol `global_a.*bind externally.*fPIC.* -- 2.30.2