summaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2012-05-10 03:25:17 +0000
committerH.J. Lu <hjl.tools@gmail.com>2012-05-10 03:25:17 +0000
commit8cf0d2dd210b73dff4a2d63d60c49e42b86565a7 (patch)
treec73a06cc9dcf7ab583730ab2273ced526febf4cd /gas
parent968bf8f19d1668f5ad2b6cd6c7c251e72ed09756 (diff)
downloadbinutils-gdb-8cf0d2dd210b73dff4a2d63d60c49e42b86565a7.tar.gz
Check 64-bit relocation addend overflow for x32
bfd/ * elf64-x86-64.c (elf_x86_64_relocate_section): Check addend overflow for R_X86_64_RELATIVE64. gas/ * config/tc-i386.c (tc_gen_reloc): Check x32 addend overflow for BFD_RELOC_64. gas/testsuite/ * gas/i386/ilp32/ilp32.exp: Run reloc64-inval. * gas/i386/ilp32/reloc64.s: Add tests for ".quad". * gas/i386/ilp32/reloc64.d: Updated. * gas/i386/ilp32/reloc64-inval.l: New file. * gas/i386/ilp32/reloc64-inval.s: Likewise. ld/testsuite/ * ld-x86-64/ilp32-11.d: New file. * ld-x86-64/ilp32-11.s: Likewise. * ld-x86-64/x86-64.exp: Run ilp32-11.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/config/tc-i386.c11
-rw-r--r--gas/testsuite/ChangeLog10
-rw-r--r--gas/testsuite/gas/i386/ilp32/ilp32.exp1
-rw-r--r--gas/testsuite/gas/i386/ilp32/reloc64-inval.l3
-rw-r--r--gas/testsuite/gas/i386/ilp32/reloc64-inval.s3
-rw-r--r--gas/testsuite/gas/i386/ilp32/reloc64.d3
-rw-r--r--gas/testsuite/gas/i386/ilp32/reloc64.s5
8 files changed, 41 insertions, 0 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 2cc6360525c..3b43ecd06e8 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,8 @@
+2012-05-09 H.J. Lu <hongjiu.lu@intel.com>
+
+ * config/tc-i386.c (tc_gen_reloc): Check x32 addend overflow
+ for BFD_RELOC_64.
+
2012-05-08 Alan Modra <amodra@gmail.com>
* Makefile.am (check_DEJAGNU): Export LC_ALL=C in place of other
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index ccf54bcae54..06f9764e228 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -9173,6 +9173,17 @@ tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
if (disallow_64bit_reloc)
switch (code)
{
+ case BFD_RELOC_64:
+ /* Check addend overflow. */
+ if ((long long) fixp->fx_offset > 0x7fffffffLL
+ || (long long) fixp->fx_offset < -0x80000000LL)
+ {
+ 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);
+ }
+ break;
case BFD_RELOC_X86_64_DTPOFF64:
case BFD_RELOC_X86_64_TPOFF64:
case BFD_RELOC_64_PCREL:
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index e9c7bc771ce..7559561993c 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,13 @@
+2012-05-09 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gas/i386/ilp32/ilp32.exp: Run reloc64-inval.
+
+ * gas/i386/ilp32/reloc64.s: Add tests for ".quad".
+ * gas/i386/ilp32/reloc64.d: Updated.
+
+ * gas/i386/ilp32/reloc64-inval.l: New file.
+ * gas/i386/ilp32/reloc64-inval.s: Likewise.
+
2012-05-08 Alan Modra <amodra@gmail.com>
* lib/gas-defs.exp (run_dump_test): Don't set LC_ALL here.
diff --git a/gas/testsuite/gas/i386/ilp32/ilp32.exp b/gas/testsuite/gas/i386/ilp32/ilp32.exp
index de43bf25ed7..95f3a2d69d4 100644
--- a/gas/testsuite/gas/i386/ilp32/ilp32.exp
+++ b/gas/testsuite/gas/i386/ilp32/ilp32.exp
@@ -26,6 +26,7 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_64_check] &&
}
run_list_test "reloc64" "--defsym _bad_=1"
+ run_list_test "reloc64-inval"
set ASFLAGS "$old_ASFLAGS"
}
diff --git a/gas/testsuite/gas/i386/ilp32/reloc64-inval.l b/gas/testsuite/gas/i386/ilp32/reloc64-inval.l
new file mode 100644
index 00000000000..13282371d46
--- /dev/null
+++ b/gas/testsuite/gas/i386/ilp32/reloc64-inval.l
@@ -0,0 +1,3 @@
+.*: Assembler messages:
+.*:2: Error: .*
+.*:3: Error: .*
diff --git a/gas/testsuite/gas/i386/ilp32/reloc64-inval.s b/gas/testsuite/gas/i386/ilp32/reloc64-inval.s
new file mode 100644
index 00000000000..14134aaf5dd
--- /dev/null
+++ b/gas/testsuite/gas/i386/ilp32/reloc64-inval.s
@@ -0,0 +1,3 @@
+ .data
+ .quad xtrn + 0x80000000
+ .quad xtrn - 0x80000001
diff --git a/gas/testsuite/gas/i386/ilp32/reloc64.d b/gas/testsuite/gas/i386/ilp32/reloc64.d
index 08c15e41857..140f24d781b 100644
--- a/gas/testsuite/gas/i386/ilp32/reloc64.d
+++ b/gas/testsuite/gas/i386/ilp32/reloc64.d
@@ -90,3 +90,6 @@ Disassembly of section \.data:
.*[ ]+R_X86_64_PC16[ ]+xtrn
.*[ ]+R_X86_64_8[ ]+xtrn
.*[ ]+R_X86_64_PC8[ ]+xtrn
+.*[ ]+R_X86_64_64[ ]+xtrn
+.*[ ]+R_X86_64_64[ ]+xtrn\+0x7fffffff
+.*[ ]+R_X86_64_64[ ]+xtrn\+0x80000000
diff --git a/gas/testsuite/gas/i386/ilp32/reloc64.s b/gas/testsuite/gas/i386/ilp32/reloc64.s
index 3f18d04b025..3a2dbb87495 100644
--- a/gas/testsuite/gas/i386/ilp32/reloc64.s
+++ b/gas/testsuite/gas/i386/ilp32/reloc64.s
@@ -178,3 +178,8 @@ bad .byte xtrn@tpoff
.text
mov xtrn@tpoff (%rbx), %eax
+
+ .data
+ .quad xtrn
+ .quad xtrn + 0x7fffffff
+ .quad xtrn - 0x80000000