+2017-09-14 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/22135
+ * elf32-i386.c (elf_i386_convert_load_reloc): Add an argument
+ to indicate if conversion is performed.
+ (elf_i386_check_relocs): Cache section contents and relocations
+ if conversion is performed.
+ * elf64-x86-64.c (elf_x86_64_check_relocs): Cache section
+ contents and relocations if conversion is performed.
+
2017-09-14 Nick Clifton <nickc@redhat.com>
PR binutils/22113
unsigned int *r_type_p,
Elf_Internal_Rela *irel,
struct elf_link_hash_entry *h,
+ bfd_boolean *converted,
struct bfd_link_info *link_info)
{
struct elf_x86_link_hash_table *htab;
bfd_put_32 (abfd, -4, contents + irel->r_offset);
irel->r_info = ELF32_R_INFO (r_symndx, R_386_PC32);
*r_type_p = R_386_PC32;
+ *converted = TRUE;
}
}
else
bfd_put_8 (abfd, opcode, contents + roff - 2);
irel->r_info = ELF32_R_INFO (r_symndx, r_type);
*r_type_p = r_type;
+ *converted = TRUE;
}
}
const Elf_Internal_Rela *rel_end;
asection *sreloc;
bfd_byte *contents;
+ bfd_boolean converted;
if (bfd_link_relocatable (info))
return TRUE;
symtab_hdr = &elf_symtab_hdr (abfd);
sym_hashes = elf_sym_hashes (abfd);
+ converted = FALSE;
+
sreloc = NULL;
rel_end = relocs + sec->reloc_count;
{
Elf_Internal_Rela *irel = (Elf_Internal_Rela *) rel;
if (!elf_i386_convert_load_reloc (abfd, symtab_hdr, contents,
- &r_type, irel, h, info))
+ &r_type, irel, h,
+ &converted, info))
goto error_return;
}
if (elf_section_data (sec)->this_hdr.contents != contents)
{
- if (!info->keep_memory)
+ if (!converted && !info->keep_memory)
free (contents);
else
{
- /* Cache the section contents for elf_link_input_bfd. */
+ /* Cache the section contents for elf_link_input_bfd if any
+ load is converted or --no-keep-memory isn't used. */
elf_section_data (sec)->this_hdr.contents = contents;
}
}
+ /* Cache relocations if any load is converted. */
+ if (elf_section_data (sec)->relocs != relocs && converted)
+ elf_section_data (sec)->relocs = (Elf_Internal_Rela *) relocs;
+
return TRUE;
error_return:
const Elf_Internal_Rela *rel_end;
asection *sreloc;
bfd_byte *contents;
+ bfd_boolean converted;
if (bfd_link_relocatable (info))
return TRUE;
symtab_hdr = &elf_symtab_hdr (abfd);
sym_hashes = elf_sym_hashes (abfd);
+ converted = FALSE;
+
sreloc = NULL;
rel_end = relocs + sec->reloc_count;
irel, h, &converted_reloc,
info))
goto error_return;
+
+ if (converted_reloc)
+ converted = TRUE;
}
if (! elf_x86_64_tls_transition (info, abfd, sec, contents,
if (elf_section_data (sec)->this_hdr.contents != contents)
{
- if (!info->keep_memory)
+ if (!converted && !info->keep_memory)
free (contents);
else
{
- /* Cache the section contents for elf_link_input_bfd. */
+ /* Cache the section contents for elf_link_input_bfd if any
+ load is converted or --no-keep-memory isn't used. */
elf_section_data (sec)->this_hdr.contents = contents;
}
}
+ /* Cache relocations if any load is converted. */
+ if (elf_section_data (sec)->relocs != relocs && converted)
+ elf_section_data (sec)->relocs = (Elf_Internal_Rela *) relocs;
+
return TRUE;
error_return:
+2017-09-14 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/22135
+ * testsuite/ld-i386/i386.exp: Run pr22135.
+ * testsuite/ld-x86-64/x86-64.exp: Likewise.
+ * testsuite/ld-i386/pr22135.d: New file.
+ * testsuite/ld-i386/pr22135.s: Likewise.
+ * testsuite/ld-x86-64/pr22135.d: Likewise.
+ * testsuite/ld-x86-64/pr22135.s: Likewise.
+
2017-09-09 Alan Modra <amodra@gmail.com>
* ld.texinfo (--plt-align): Describe new behaviour of option.
run_dump_test "pr22115-1b"
run_dump_test "pr22115-1c"
run_dump_test "pr22115-1d"
+run_dump_test "pr22135"
if { !([istarget "i?86-*-linux*"]
|| [istarget "i?86-*-gnu*"]
--- /dev/null
+#as: --32 -mrelax-relocations=yes
+#ld: -pie -melf_i386 --no-keep-memory
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+#...
+[ ]*[a-f0-9]+: 8d 81 ([0-9a-f]{2} ){4} * lea -0x[a-f0-9]+\(%ecx\),%eax
+#pass
--- /dev/null
+ .text
+ .globl foo
+ .type foo, @function
+foo:
+ ret
+ .size foo, .-foo
+ .globl _start
+ .type _start, @function
+_start:
+ movl foo@GOT(%ecx), %eax
+ .size _start, .-_start
--- /dev/null
+#as: --64
+#ld: -pie -melf_x86_64 --no-keep-memory
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+#...
+[ ]*[a-f0-9]+: 8d 05 ([0-9a-f]{2} ){4} * lea -0x[a-f0-9]+\(%rip\),%eax # [a-f0-9]+ <foo>
+#pass
--- /dev/null
+ .text
+ .globl foo
+ .type foo, @function
+foo:
+ ret
+ .size foo, .-foo
+ .globl _start
+ .type _start, @function
+_start:
+ movl foo@GOTPCREL(%rip), %eax
+ .size _start, .-_start
run_dump_test "pr22115-1c-x32"
run_dump_test "pr22115-1d"
run_dump_test "pr22115-1d-x32"
+run_dump_test "pr22135"
if { ![istarget "x86_64-*-linux*"] && ![istarget "x86_64-*-nacl*"]} {
return