This is the mail archive of the binutils@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]

Re: RFC: Should AArch64 *_NC relocs complain on overflow ?


Hi Jiong,

> I'd suggest add "LD_PREL_LO19" to the check list, then we will give this
> particular unalignment warning for all normal data access load/sotre
> relocation types which are particularly useful to external users.

OK - this is the patch that I have now checked in.

Cheers
  Nick

bfd/ChangeLog
2016-02-09  Nick Clifton  <nickc@redhat.com>

	* elfnn-aarch64.c (elfNN_aarch64_relocate_section): Add a more
	helpful warning message to explain why certain AArch64 relocs
	might overflow.

ld/ChangeLog
2016-02-09  Nick Clifton  <nickc@redhat.com>

	* testsuite/ld-aarch64/reloc-overflow-bad.d: New test.
	* testsuite/ld-aarch64/reloc-overflow-1.s: New source file.
	* testsuite/ld-aarch64/reloc-overflow-2.s: New source file.
	* testsuite/ld-aarch64/aarch64-elf.exp: Run the new test.
diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c
index 292470df..99acab4 100644
--- a/bfd/elfnn-aarch64.c
+++ b/bfd/elfnn-aarch64.c
@@ -6405,10 +6405,6 @@ elfNN_aarch64_relocate_section (bfd *output_bfd,
 	  break;
 	}
 
-      if (!save_addend)
-	addend = 0;
-
-
       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
          because such sections are not SEC_ALLOC and thus ld.so will
          not process them.  */
@@ -6448,6 +6444,34 @@ elfNN_aarch64_relocate_section (bfd *output_bfd,
 		     name, input_bfd, input_section, rel->r_offset);
 		  return FALSE;
 		}
+	      /* Overflow can occur when a variable is referenced with a type
+		 that has a larger alignment than the type with which it was
+		 declared. eg:
+		   file1.c: extern int foo; int a (void) { return foo; }
+		   file2.c: char bar, foo, baz;
+		 If the variable is placed into a data section at an offset
+		 that is incompatible with the larger alignment requirement
+		 overflow will occur.  (Strictly speaking this is not overflow
+		 but rather an alignment problem, but the bfd_reloc_ error
+		 enum does not have a value to cover that situation).
+
+		 Try to catch this situation here and provide a more helpful
+		 error message to the user.  */
+	      if (addend & ((1 << howto->rightshift) - 1)
+		  /* FIXME: Are we testing all of the appropriate reloc
+		     types here ?  */
+		  && (real_r_type == BFD_RELOC_AARCH64_LD_LO19_PCREL
+		      || real_r_type == BFD_RELOC_AARCH64_LDST16_LO12
+		      || real_r_type == BFD_RELOC_AARCH64_LDST32_LO12
+		      || real_r_type == BFD_RELOC_AARCH64_LDST64_LO12
+		      || real_r_type == BFD_RELOC_AARCH64_LDST128_LO12))
+		{
+		  info->callbacks->warning
+		    (info, _("One possible cause of this error is that the \
+symbol is being referenced in the indicated code as if it had a larger \
+alignment than was declared where it was defined."),
+		     name, input_bfd, input_section, rel->r_offset);
+		}
 	      break;
 
 	    case bfd_reloc_undefined:
@@ -6482,6 +6506,9 @@ elfNN_aarch64_relocate_section (bfd *output_bfd,
 	      break;
 	    }
 	}
+
+      if (!save_addend)
+	addend = 0;
     }
 
   return TRUE;
diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp
index 939539e..d0b33cf 100644
--- a/ld/testsuite/ld-aarch64/aarch64-elf.exp
+++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp
@@ -159,6 +159,8 @@ run_dump_test "emit-relocs-537"
 run_dump_test "emit-relocs-537-overflow"
 run_dump_test "emit-relocs-538"
 
+run_dump_test "reloc-overflow-bad"
+
 # test addend correctness when --emit-relocs specified for non-relocatable obj.
 run_dump_test "emit-relocs-local-addend"
 # test addend correctness when -r specified.
@@ -281,9 +283,9 @@ run_dump_test "plt_mapping_symbol"
 
 set aarch64elflinktests {
   {"ld-aarch64/so with global symbol" "-shared" "" "" {copy-reloc-so.s}
-  {} "copy-reloc-so.so"}
+    {} "copy-reloc-so.so"}
   {"ld-aarch64/exe with copy relocation" "-e0 tmpdir/copy-reloc-so.so" "" ""
-  {copy-reloc-exe.s} {{objdump -R copy-reloc.d}} "copy-reloc"}
+    {copy-reloc-exe.s} {{objdump -R copy-reloc.d}} "copy-reloc"}
 }
 
 run_ld_link_tests $aarch64elflinktests
--- /dev/null	2016-02-09 07:51:32.551961845 +0000
+++ ld/testsuite/ld-aarch64/reloc-overflow-bad.d	2016-02-09 09:49:41.152214964 +0000
@@ -0,0 +1,4 @@
+#source: reloc-overflow-1.s
+#source: reloc-overflow-2.s
+#ld: -e0
+#error: .*One possible cause.*
--- /dev/null	2016-02-09 07:51:32.551961845 +0000
+++ ld/testsuite/ld-aarch64/reloc-overflow-1.s	2016-02-08 12:30:59.584834873 +0000
@@ -0,0 +1,14 @@
+        .file   "1.c"
+        .text
+        .align  2
+        .p2align 3,,7
+        .global dec
+        .arch armv8-a+fp+simd
+        //.tune generic
+        .type   dec, %function
+dec:
+        adrp    x0, var_2
+        ldr     w0, [x0, #:lo12:var_2]
+        ret
+        .size   dec, .-dec
+        .ident  "GCC: (GNU) 6.0.0 20160208 (experimental) [trunk revision 233206]"
--- /dev/null	2016-02-09 07:51:32.551961845 +0000
+++ ld/testsuite/ld-aarch64/reloc-overflow-2.s	2016-02-08 12:31:36.679037435 +0000
@@ -0,0 +1,5 @@
+        .file   "2.c"
+        .comm   var_3,1,1
+        .comm   var_2,1,1
+        .comm   var_1,1,1
+        .ident  "GCC: (GNU) 6.0.0 20160208 (experimental) [trunk revision 233206]"

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