x86: Delay setting the iplt section alignment
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. bfd/ 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. ld/ 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.
This commit is contained in:
parent
4770fb94ee
commit
b44ee3a8cf
@ -1,3 +1,12 @@
|
||||
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
|
||||
|
@ -1275,6 +1275,14 @@ _bfd_x86_elf_size_dynamic_sections (bfd *output_bfd,
|
||||
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,
|
||||
@ -2907,15 +2915,23 @@ error_alignment:
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
|
@ -389,6 +389,9 @@ struct elf_x86_plt_layout
|
||||
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;
|
||||
|
13
ld/ChangeLog
13
ld/ChangeLog
@ -1,3 +1,16 @@
|
||||
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,
|
||||
|
@ -482,6 +482,7 @@ run_dump_test "pr23486b"
|
||||
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*"]
|
||||
|
11
ld/testsuite/ld-i386/pr23930.d
Normal file
11
ld/testsuite/ld-i386/pr23930.d
Normal file
@ -0,0 +1,11 @@
|
||||
#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
|
10
ld/testsuite/ld-x86-64/pr23930-32.t
Normal file
10
ld/testsuite/ld-x86-64/pr23930-32.t
Normal file
@ -0,0 +1,10 @@
|
||||
PHDRS {
|
||||
text PT_LOAD;
|
||||
}
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = (0x8000000f + ALIGN(0x1000000, 0x1000000));
|
||||
.text : AT(ADDR(.text) - 0x8000000f) {
|
||||
} :text
|
||||
}
|
11
ld/testsuite/ld-x86-64/pr23930-x32.d
Normal file
11
ld/testsuite/ld-x86-64/pr23930-x32.d
Normal file
@ -0,0 +1,11 @@
|
||||
#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
|
11
ld/testsuite/ld-x86-64/pr23930.d
Normal file
11
ld/testsuite/ld-x86-64/pr23930.d
Normal file
@ -0,0 +1,11 @@
|
||||
#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
|
10
ld/testsuite/ld-x86-64/pr23930.t
Normal file
10
ld/testsuite/ld-x86-64/pr23930.t
Normal file
@ -0,0 +1,10 @@
|
||||
PHDRS {
|
||||
text PT_LOAD;
|
||||
}
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = (0xffffffff8000000f + ALIGN(0x1000000, 0x1000000));
|
||||
.text : AT(ADDR(.text) - 0xffffffff8000000f) {
|
||||
} :text
|
||||
}
|
7
ld/testsuite/ld-x86-64/pr23930a.s
Normal file
7
ld/testsuite/ld-x86-64/pr23930a.s
Normal file
@ -0,0 +1,7 @@
|
||||
.text
|
||||
.globl other
|
||||
.type other, @function
|
||||
other:
|
||||
xorl %eax, %eax
|
||||
ret
|
||||
.size other, .-other
|
14
ld/testsuite/ld-x86-64/pr23930b.s
Normal file
14
ld/testsuite/ld-x86-64/pr23930b.s
Normal file
@ -0,0 +1,14 @@
|
||||
.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
|
@ -422,6 +422,8 @@ run_dump_test "pr23486c-x32"
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user