+2018-12-01 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/23930
+ * elfxx-x86.c (_bfd_x86_elf_size_dynamic_sections): Update
+ the iplt section alignment if it is non-empty.
+ (_bfd_x86_elf_link_setup_gnu_properties): Set plt.iplt_alignment
+ and delay setting the iplt section alignment.
+ * elfxx-x86.h (elf_x86_plt_layout): Add iplt_alignment.
+
2018-11-30 Nick Clifton <nickc@redhat.com>
PR 23942
if ((s->flags & SEC_HAS_CONTENTS) == 0)
continue;
+ /* NB: Initially, the iplt section has minimal alignment to
+ avoid moving dot of the following section backwards when
+ it is empty. Update its section alignment now since it
+ is non-empty. */
+ if (s == htab->elf.iplt)
+ bfd_set_section_alignment (s->owner, s,
+ htab->plt.iplt_alignment);
+
/* Allocate memory for the section contents. We use bfd_zalloc
here in case unused entries are not reclaimed before the
section's contents are written out. This should not happen,
}
}
- if (normal_target)
+ /* The .iplt section is used for IFUNC symbols in static
+ executables. */
+ sec = htab->elf.iplt;
+ if (sec != NULL)
{
- /* The .iplt section is used for IFUNC symbols in static
- executables. */
- sec = htab->elf.iplt;
- if (sec != NULL
- && !bfd_set_section_alignment (sec->owner, sec,
- plt_alignment))
+ /* NB: Delay setting its alignment until we know it is non-empty.
+ Otherwise an empty iplt section may change vma and lma of the
+ following sections, which triggers moving dot of the following
+ section backwards, resulting in a warning and section lma not
+ being set properly. It later leads to a "File truncated"
+ error. */
+ if (!bfd_set_section_alignment (sec->owner, sec, 0))
goto error_alignment;
+
+ htab->plt.iplt_alignment = (normal_target
+ ? plt_alignment
+ : bed->plt_alignment);
}
return pbfd;
This is only used for x86-64. */
unsigned int plt_got_insn_size;
+ /* Alignment of the .iplt section. */
+ unsigned int iplt_alignment;
+
/* .eh_frame covering the .plt section. */
const bfd_byte *eh_frame_plt;
unsigned int eh_frame_plt_size;
+2018-12-01 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/23930
+ * testsuite/ld-i386/i386.exp: Run pr23930.
+ * testsuite/ld-i386/pr23930.d: New file.
+ * testsuite/ld-x86-64/pr23930-32.t: Likewise.
+ * testsuite/ld-x86-64/pr23930-x32.d: Likewise.
+ * testsuite/ld-x86-64/pr23930.d: Likewise.
+ * testsuite/ld-x86-64/pr23930.t: Likewise.
+ * testsuite/ld-x86-64/pr23930a.s: Likewise.
+ * testsuite/ld-x86-64/pr23930b.s: Likewise.
+ * testsuite/ld-x86-64/x86-64.exp: Run pr23930 and pr23930-x32.
+---
2018-11-30 Alan Modra <amodra@gmail.com>
* testsuite/ld-powerpc/pr23937.d,
run_dump_test "pr23486c"
run_dump_test "pr23486d"
run_dump_test "pr23854"
+run_dump_test "pr23930"
if { !([istarget "i?86-*-linux*"]
|| [istarget "i?86-*-gnu*"]
--- /dev/null
+#source: ../ld-x86-64/pr23930a.s
+#source: ../ld-x86-64/pr23930b.s
+#as: --32
+#ld: -m elf_i386 -z separate-code -z norelro -T ../ld-x86-64/pr23930-32.t
+#objdump: --disassemble=main
+
+#...
+[a-f0-9]+ <main>:
+[a-f0-9]+: 31 c0 xor %eax,%eax
+[a-f0-9]+: c3 ret
+#pass
--- /dev/null
+PHDRS {
+ text PT_LOAD;
+}
+
+SECTIONS
+{
+ . = (0x8000000f + ALIGN(0x1000000, 0x1000000));
+ .text : AT(ADDR(.text) - 0x8000000f) {
+ } :text
+}
--- /dev/null
+#source: pr23930a.s
+#source: pr23930b.s
+#as: --x32
+#ld: -m elf32_x86_64 -z separate-code -z norelro -T pr23930-32.t
+#objdump: --disassemble=main
+
+#...
+[a-f0-9]+ <main>:
+[a-f0-9]+: 31 c0 xor %eax,%eax
+[a-f0-9]+: c3 retq
+#pass
--- /dev/null
+#source: pr23930a.s
+#source: pr23930b.s
+#as: --64
+#ld: -m elf_x86_64 -z separate-code -z norelro -T pr23930.t
+#objdump: --disassemble=main
+
+#...
+[a-f0-9]+ <main>:
+[a-f0-9]+: 31 c0 xor %eax,%eax
+[a-f0-9]+: c3 retq
+#pass
--- /dev/null
+PHDRS {
+ text PT_LOAD;
+}
+
+SECTIONS
+{
+ . = (0xffffffff8000000f + ALIGN(0x1000000, 0x1000000));
+ .text : AT(ADDR(.text) - 0xffffffff8000000f) {
+ } :text
+}
--- /dev/null
+ .text
+ .globl other
+ .type other, @function
+other:
+ xorl %eax, %eax
+ ret
+ .size other, .-other
--- /dev/null
+ .text
+ .globl orig
+ .type orig, @function
+orig:
+ xorl %eax, %eax
+ ret
+ .size orig, .-orig
+ .section .text.startup,"ax",@progbits
+ .globl main
+ .type main, @function
+main:
+ xorl %eax, %eax
+ ret
+ .size main, .-main
run_dump_test "pr23486d"
run_dump_test "pr23486d-x32"
run_dump_test "pr23854"
+run_dump_test "pr23930"
+run_dump_test "pr23930-x32"
if { ![istarget "x86_64-*-linux*"] && ![istarget "x86_64-*-nacl*"]} {
return