aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2018-12-01 05:42:33 -0800
committerH.J. Lu <hjl.tools@gmail.com>2018-12-01 06:35:03 -0800
commitb44ee3a8cf21294eeb079ffbada7eeb559a9c6b4 (patch)
tree4b588c9acba669ccb1dfa6f349e7b7f1b31aa740 /bfd
parent4770fb94ee04ef767cb2c171a24168d2b5acca04 (diff)
downloadgdb-b44ee3a8cf21294eeb079ffbada7eeb559a9c6b4.zip
gdb-b44ee3a8cf21294eeb079ffbada7eeb559a9c6b4.tar.gz
gdb-b44ee3a8cf21294eeb079ffbada7eeb559a9c6b4.tar.bz2
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.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog9
-rw-r--r--bfd/elfxx-x86.c30
-rw-r--r--bfd/elfxx-x86.h3
3 files changed, 35 insertions, 7 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index e0eb155..3210b0c 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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
diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c
index 05f5c6a..40aac66 100644
--- a/bfd/elfxx-x86.c
+++ b/bfd/elfxx-x86.c
@@ -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;
diff --git a/bfd/elfxx-x86.h b/bfd/elfxx-x86.h
index 9648438..d153623 100644
--- a/bfd/elfxx-x86.h
+++ b/bfd/elfxx-x86.h
@@ -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;