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: PATCH: Check 64-bit relocation addend overflow for x32


Hi,

I checked in this patch to display signed hex number in x32 addend
overflow check.

H.J.
--
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index fa2f5fa..a46ed85 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,10 @@
 2012-05-10  H.J. Lu  <hongjiu.lu@intel.com>
 
+	* elf64-x86-64.c (elf_x86_64_relocate_section): Display signed
+	hex number in x32 addend overflow check.
+
+2012-05-10  H.J. Lu  <hongjiu.lu@intel.com>
+
 	* elf64-x86-64.c (elf_x86_64_reloc_type_class): Handle
 	R_X86_64_RELATIVE64.
 
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index a9429b8..e98c325 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -3686,19 +3686,28 @@ elf_x86_64_relocate_section (bfd *output_bfd,
 			  != (rel->r_addend & 0x80000000))
 			{
 			  const char *name;
+			  long addend = rel->r_addend;
 			  if (h && h->root.root.string)
 			    name = h->root.root.string;
 			  else
 			    name = bfd_elf_sym_name (input_bfd, symtab_hdr,
 						     sym, NULL);
-			  (*_bfd_error_handler)
-			    (_("%B: addend %ld in relocation %s against "
-			       "symbol `%s' at 0x%lx in section `%A' is "
-			       "out of range"),
-			     input_bfd, input_section,
-			     (long) rel->r_addend,
-			     x86_64_elf_howto_table[r_type].name,
-			     name, (unsigned long) rel->r_offset);
+			  if (addend < 0)
+			    (*_bfd_error_handler)
+			      (_("%B: addend -0x%lx in relocation %s against "
+				 "symbol `%s' at 0x%lx in section `%A' is "
+				 "out of range"),
+			       input_bfd, input_section, addend,
+			       x86_64_elf_howto_table[r_type].name,
+			       name, (unsigned long) rel->r_offset);
+			  else
+			    (*_bfd_error_handler)
+			      (_("%B: addend 0x%lx in relocation %s against "
+				 "symbol `%s' at 0x%lx in section `%A' is "
+				 "out of range"),
+			       input_bfd, input_section, addend,
+			       x86_64_elf_howto_table[r_type].name,
+			       name, (unsigned long) rel->r_offset);
 			  bfd_set_error (bfd_error_bad_value);
 			  return FALSE;
 			}
diff --git a/gas/ChangeLog b/gas/ChangeLog
index f9a6e26..dfe45d2 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,8 @@
+2012-05-10  H.J. Lu  <hongjiu.lu@intel.com>
+
+	* config/tc-i386.c (tc_gen_reloc): Display signed hex number in
+	x32 addend overflow check.
+
 2012-05-09  H.J. Lu  <hongjiu.lu@intel.com>
 
 	* config/tc-i386.c (tc_gen_reloc): Use fits_in_signed_long.
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index ab5233d..e3440f0 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -9177,10 +9177,17 @@ tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
 	    /* Check addend overflow.  */
 	    if (!fits_in_signed_long (fixp->fx_offset))
 	      {
-		as_bad_where (fixp->fx_file, fixp->fx_line,
-			      _("cannot represent relocation %s with addend %lld in x32 mode"),
-			      bfd_get_reloc_code_name (code),
-			      (long long) fixp->fx_offset);
+		long long addend = fixp->fx_offset;
+		if (addend < 0)
+		  as_bad_where (fixp->fx_file, fixp->fx_line,
+				_("cannot represent relocation %s with "
+				  "addend -0x%llx in x32 mode"),
+				bfd_get_reloc_code_name (code), -addend);
+		else
+		  as_bad_where (fixp->fx_file, fixp->fx_line,
+				_("cannot represent relocation %s with "
+				  "addend 0x%llx in x32 mode"),
+				bfd_get_reloc_code_name (code), addend);
 	      }
 	    break;
 	  case BFD_RELOC_X86_64_DTPOFF64:
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index 1cd1b4e..09cb6b9 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,5 +1,9 @@
 2012-05-10  H.J. Lu  <hongjiu.lu@intel.com>
 
+	* ld-x86-64/ilp32-11.d: Updated.
+
+2012-05-10  H.J. Lu  <hongjiu.lu@intel.com>
+
 	* ld-x86-64/pr13082-1a.d: Check RELACOUNT.
 	* ld-x86-64/pr13082-1b.d: Likewise.
 
diff --git a/ld/testsuite/ld-x86-64/ilp32-11.d b/ld/testsuite/ld-x86-64/ilp32-11.d
index 7240c58..56bb8b3 100644
--- a/ld/testsuite/ld-x86-64/ilp32-11.d
+++ b/ld/testsuite/ld-x86-64/ilp32-11.d
@@ -1,3 +1,3 @@
 #as: --x32
 #ld: -shared -melf32_x86_64
-#error: .*addend 2147483647 in relocation R_X86_64_64 against symbol `.text' at 0x0 in section `.data.rel.local' is out of range
+#error: .*addend 0x7fffffff in relocation R_X86_64_64 against symbol `.text' at 0x0 in section `.data.rel.local' is out of range


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