This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] [PR20402][LD][AARCH64]Don't emit RELATIVE relocation for absolute symbols which are resolved at stat


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=0c1ded8dc0be9c61975e04a0b416b064223f7bda

commit 0c1ded8dc0be9c61975e04a0b416b064223f7bda
Author: Renlin Li <renlin.li@arm.com>
Date:   Wed Mar 7 09:27:45 2018 +0000

    [PR20402][LD][AARCH64]Don't emit RELATIVE relocation for absolute symbols which are resolved at static linking time.
    
    For absolute symbols which are forced local or not dynamic, the ABS relocation
    should be resolved at static linking time.
    
    Originally, an RELATIVE/ABS relocation will be generated even for absolution
    symbols for the dynamic linker to resolve.
    
    bfd/
    
    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.
    
    ld/
    
    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.

Diff:
---
 bfd/ChangeLog                           |  6 ++++++
 bfd/elfnn-aarch64.c                     | 13 +++++++++++--
 ld/ChangeLog                            |  7 +++++++
 ld/testsuite/ld-aarch64/aarch64-elf.exp |  1 +
 ld/testsuite/ld-aarch64/pr20402.d       |  7 +++++++
 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]