Browse Source

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.
binutils-2_27-branch
H.J. Lu 10 years ago
parent
commit
7d4d970973
  1. 7
      bfd/ChangeLog
  2. 25
      bfd/elf32-i386.c
  3. 8
      ld/ChangeLog
  4. 1
      ld/testsuite/ld-i386/i386.exp
  5. 4
      ld/testsuite/ld-i386/pr19609-1i.d
  6. 12
      ld/testsuite/ld-i386/pr20117.d
  7. 7
      ld/testsuite/ld-i386/pr20117.s

7
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

25
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);

8
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.

1
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*"]

4
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\)

12
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

7
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
Loading…
Cancel
Save