diff options
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/elfnn-aarch64.c | 13 | ||||
-rw-r--r-- | ld/ChangeLog | 7 | ||||
-rw-r--r-- | ld/testsuite/ld-aarch64/aarch64-elf.exp | 1 | ||||
-rw-r--r-- | ld/testsuite/ld-aarch64/pr20402.d | 7 | ||||
-rw-r--r-- | ld/testsuite/ld-aarch64/pr20402.s | 6 |
6 files changed, 38 insertions, 2 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 09fae15..c0ad7eb 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2018-03-07 Renlin Li <renlin.li@arm.com> + + PR ld/20402 + * elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Check absolute + symbol, and don't emit relocation in specific case. + 2018-03-07 Alan Modra <amodra@gmail.com> * elf64-mips.c (mips_elf64_rtype_to_howto): Return NULL on error. diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index dc24df8..beef91a 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -5074,6 +5074,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, asection *base_got; bfd_vma orig_value = value; bfd_boolean resolved_to_zero; + bfd_boolean abs_symbol_p; globals = elf_aarch64_hash_table (info); @@ -5093,6 +5094,9 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, weak_undef_p = (h ? h->root.type == bfd_link_hash_undefweak : bfd_is_und_section (sym_sec)); + abs_symbol_p = (h !=NULL && h->root.type == bfd_link_hash_defined + && bfd_is_abs_section (h->root.u.def.section)); + /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it here if it is defined in a non-shared object. */ @@ -5360,6 +5364,12 @@ bad_ifunc_reloc: skip = TRUE; relocate = TRUE; } + else if (abs_symbol_p) + { + /* Local absolute symbol. */ + skip = (h->forced_local || (h->dynindx == -1)); + relocate = skip; + } outrel.r_offset += (input_section->output_section->vma + input_section->output_offset); @@ -5369,8 +5379,7 @@ bad_ifunc_reloc: else if (h != NULL && h->dynindx != -1 && (!bfd_link_pic (info) - || !(bfd_link_pie (info) - || SYMBOLIC_BIND (info, h)) + || !(bfd_link_pie (info) || SYMBOLIC_BIND (info, h)) || !h->def_regular)) outrel.r_info = ELFNN_R_INFO (h->dynindx, r_type); else diff --git a/ld/ChangeLog b/ld/ChangeLog index 218df5c..dd441fa 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,10 @@ +2018-03-07 Renlin Li <renlin.li@arm.com> + + PR ld/20402 + * testsuite/ld-aarch64/aarch64-elf.exp: Run new test. + * testsuite/ld-aarch64/pr20402.s: New. + * testsuite/ld-aarch64/pr20402.d: New. + 2018-03-06 Jim Wilson <jimw@sifive.com> PR 22920 diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp index c67ffb1..de99a8b 100644 --- a/ld/testsuite/ld-aarch64/aarch64-elf.exp +++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp @@ -286,6 +286,7 @@ run_dump_test_lp64 "tprel_g2_overflow" run_dump_test "tprel_add_lo12_overflow" run_dump_test "protected-data" run_dump_test_lp64 "pr22764" +run_dump_test_lp64 "pr20402" # ifunc tests run_dump_test "ifunc-1" diff --git a/ld/testsuite/ld-aarch64/pr20402.d b/ld/testsuite/ld-aarch64/pr20402.d new file mode 100644 index 0000000..9cfeeb7 --- /dev/null +++ b/ld/testsuite/ld-aarch64/pr20402.d @@ -0,0 +1,7 @@ +#ld: -pie -defsym foo=0x1 -defsym bar=0x2 +#readelf: -r + +Relocation section '\.rela\.dyn' at offset .* contains 2 entries: + Offset Info Type Sym\. Value Sym\. Name \+ Addend +000000000000 000000000000 R_AARCH64_NONE 0 +000000000000 000000000000 R_AARCH64_NONE 0 diff --git a/ld/testsuite/ld-aarch64/pr20402.s b/ld/testsuite/ld-aarch64/pr20402.s new file mode 100644 index 0000000..b18c5e7 --- /dev/null +++ b/ld/testsuite/ld-aarch64/pr20402.s @@ -0,0 +1,6 @@ + .text + .global _start + .hidden foo +_start: + .xword foo + .xword bar |