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] Don't convert R_386_GOT32 relocation


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

commit 7d4d970973c4735dcdd2a69d645309f167a1d9d4
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu May 19 12:56:55 2016 -0700

    Don't convert R_386_GOT32 relocation
    
    Don't convert R_386_GOT32 since we can't tell if it is applied
    to "mov $foo@GOT, %reg" which isn't a load via GOT.
    
    bfd/
    
    	PR ld/20117
    	* elf32-i386.c (elf_i386_convert_load_reloc): Don't check
    	R_386_GOT32X.
    	(elf_i386_convert_load): Don't convert R_386_GOT32.
    
    ld/
    
    	PR ld/20117
    	* testsuite/ld-i386/i386.exp: Run pr20117.
    	* testsuite/ld-i386/pr19609-1i.d: Updated.
    	* testsuite/ld-i386/pr20117.d: New file.
    	* testsuite/ld-i386/pr20117.s: Likewise.

Diff:
---
 bfd/ChangeLog                     |  7 +++++++
 bfd/elf32-i386.c                  | 25 ++++++++-----------------
 ld/ChangeLog                      |  8 ++++++++
 ld/testsuite/ld-i386/i386.exp     |  1 +
 ld/testsuite/ld-i386/pr19609-1i.d |  4 ++--
 ld/testsuite/ld-i386/pr20117.d    | 12 ++++++++++++
 ld/testsuite/ld-i386/pr20117.s    |  7 +++++++
 7 files changed, 45 insertions(+), 19 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 878f22f..64aac63 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2016-05-19  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR ld/20117
+	* elf32-i386.c (elf_i386_convert_load_reloc): Don't check
+	R_386_GOT32X.
+	(elf_i386_convert_load): Don't convert R_386_GOT32.
+
 2016-05-20  Alan Modra  <amodra@gmail.com>
 
 	PR gas/20118
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
index fcb22c4..c7e08aa 100644
--- a/bfd/elf32-i386.c
+++ b/bfd/elf32-i386.c
@@ -1544,7 +1544,7 @@ elf_i386_convert_load_reloc (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
   if (roff < 2)
     return TRUE;
 
-  /* Addend for R_386_GOT32 and R_386_GOT32X relocations must be 0.  */
+  /* Addend for R_386_GOT32X relocations must be 0.  */
   addend = bfd_get_32 (abfd, contents + roff);
   if (addend != 0)
     return TRUE;
@@ -1558,11 +1558,10 @@ elf_i386_convert_load_reloc (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
   modrm = bfd_get_8 (abfd, contents + roff - 1);
   baseless = (modrm & 0xc7) == 0x5;
 
-  if (r_type == R_386_GOT32X && baseless && is_pic)
+  if (baseless && is_pic)
     {
       /* For PIC, disallow R_386_GOT32X without a base register
-	 since we don't know what the GOT base is.   Allow
-	 R_386_GOT32 for existing object files.  */
+	 since we don't know what the GOT base is.  */
       const char *name;
 
       if (h == NULL)
@@ -1582,22 +1581,12 @@ elf_i386_convert_load_reloc (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
 
   opcode = bfd_get_8 (abfd, contents + roff - 2);
 
-  /* Convert mov to lea since it has been done for a while.  */
-  if (opcode != 0x8b)
-    {
-      /* Only convert R_386_GOT32X relocation for call, jmp or
-	 one of adc, add, and, cmp, or, sbb, sub, test, xor
-	 instructions.  */
-      if (r_type != R_386_GOT32X)
-	return TRUE;
-    }
-
   /* Convert to R_386_32 if PIC is false or there is no base
      register.  */
   to_reloc_32 = !is_pic || baseless;
 
-  /* Try to convert R_386_GOT32 and R_386_GOT32X.  Get the symbol
-     referred to by the reloc.  */
+  /* Try to convert R_386_GOT32X.  Get the symbol referred to by the
+     reloc.  */
   if (h == NULL)
     {
       if (opcode == 0x0ff)
@@ -3021,7 +3010,9 @@ elf_i386_convert_load (bfd *abfd, asection *sec,
       struct elf_link_hash_entry *h;
       bfd_boolean converted;
 
-      if (r_type != R_386_GOT32 && r_type != R_386_GOT32X)
+      /* Don't convert R_386_GOT32 since we can't tell if it is applied
+	 to "mov $foo@GOT, %reg" which isn't a load via GOT.  */
+      if (r_type != R_386_GOT32X)
 	continue;
 
       r_symndx = ELF32_R_SYM (irel->r_info);
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 0619b8d..638f38b 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,11 @@
+2016-05-19  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR ld/20117
+	* testsuite/ld-i386/i386.exp: Run pr20117.
+	* testsuite/ld-i386/pr19609-1i.d: Updated.
+	* testsuite/ld-i386/pr20117.d: New file.
+	* testsuite/ld-i386/pr20117.s: Likewise.
+
 2016-05-19  Cupertino Miranda  <cmiranda@synopsys.com>
 
 	* testsuite/ld-elf/compressed1d.d: Removed from notarget.
diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp
index ba53c91..8e66280 100644
--- a/ld/testsuite/ld-i386/i386.exp
+++ b/ld/testsuite/ld-i386/i386.exp
@@ -373,6 +373,7 @@ run_dump_test "pr19609-2c"
 run_dump_test "undefweaka"
 run_dump_test "undefweakb"
 run_dump_test "pr19539"
+run_dump_test "pr20117"
 
 if { !([istarget "i?86-*-linux*"]
        || [istarget "i?86-*-gnu*"]
diff --git a/ld/testsuite/ld-i386/pr19609-1i.d b/ld/testsuite/ld-i386/pr19609-1i.d
index ce15bc9..2a6d0c0 100644
--- a/ld/testsuite/ld-i386/pr19609-1i.d
+++ b/ld/testsuite/ld-i386/pr19609-1i.d
@@ -11,7 +11,7 @@ Disassembly of section .text:
 [a-f0-9]+ <_start>:
 [ 	]*[a-f0-9]+:	3b 82 fc ff ff ff    	cmp    -0x4\(%edx\),%eax
 [ 	]*[a-f0-9]+:	3b 8a fc ff ff ff    	cmp    -0x4\(%edx\),%ecx
-[ 	]*[a-f0-9]+:	c7 c0 00 00 00 00    	mov    \$0x0,%eax
-[ 	]*[a-f0-9]+:	c7 c1 00 00 00 00    	mov    \$0x0,%ecx
+[ 	]*[a-f0-9]+:	8b 82 fc ff ff ff    	mov    -0x4\(%edx\),%eax
+[ 	]*[a-f0-9]+:	8b 8a fc ff ff ff    	mov    -0x4\(%edx\),%ecx
 [ 	]*[a-f0-9]+:	85 82 fc ff ff ff    	test   %eax,-0x4\(%edx\)
 [ 	]*[a-f0-9]+:	85 8a fc ff ff ff    	test   %ecx,-0x4\(%edx\)
diff --git a/ld/testsuite/ld-i386/pr20117.d b/ld/testsuite/ld-i386/pr20117.d
new file mode 100644
index 0000000..59c77ee
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr20117.d
@@ -0,0 +1,12 @@
+#as: --32
+#ld: -melf_i386
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ 	]*[a-f0-9]+:	eb 8b                	jmp    [a-f0-9]+ <_start\-0x[a-f0-9]+>
+[ 	]*[a-f0-9]+:	bd ([0-9a-f]{2} ){4} *	mov    \$0x[a-f0-9]+\,%ebp
diff --git a/ld/testsuite/ld-i386/pr20117.s b/ld/testsuite/ld-i386/pr20117.s
new file mode 100644
index 0000000..de2dd28
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr20117.s
@@ -0,0 +1,7 @@
+	.comm	DEBUGLEVEL,4,4
+	.text
+	.globl	_start
+	.type	_start, @function
+_start:
+	.byte 0xeb, 0x8b
+	movl      $DEBUGLEVEL@GOT, %ebp


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