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.
This commit is contained in:
parent
606851fbf6
commit
7d4d970973
7 changed files with 45 additions and 19 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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*"]
|
||||
|
|
|
@ -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
Normal file
12
ld/testsuite/ld-i386/pr20117.d
Normal file
|
@ -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
Normal file
7
ld/testsuite/ld-i386/pr20117.s
Normal file
|
@ -0,0 +1,7 @@
|
|||
.comm DEBUGLEVEL,4,4
|
||||
.text
|
||||
.globl _start
|
||||
.type _start, @function
|
||||
_start:
|
||||
.byte 0xeb, 0x8b
|
||||
movl $DEBUGLEVEL@GOT, %ebp
|
Loading…
Reference in a new issue