aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf32-i386.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2016-05-19 12:56:55 -0700
committerH.J. Lu <hjl.tools@gmail.com>2016-05-19 12:57:11 -0700
commit7d4d970973c4735dcdd2a69d645309f167a1d9d4 (patch)
treee6a8b48b253a6d764479dee2757ae1c0a1752c67 /bfd/elf32-i386.c
parent606851fbf66c4a9e47c958014579dd363a74ba76 (diff)
downloadgdb-7d4d970973c4735dcdd2a69d645309f167a1d9d4.zip
gdb-7d4d970973c4735dcdd2a69d645309f167a1d9d4.tar.gz
gdb-7d4d970973c4735dcdd2a69d645309f167a1d9d4.tar.bz2
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.
Diffstat (limited to 'bfd/elf32-i386.c')
-rw-r--r--bfd/elf32-i386.c25
1 files changed, 8 insertions, 17 deletions
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);