aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2014-12-30 19:09:11 -0800
committerH.J. Lu <hjl.tools@gmail.com>2014-12-30 19:09:11 -0800
commitee3b52e917c3a19850232a6a20f5698090619fc6 (patch)
treebbc97bb0c5f38fad65e38ce93a23a6d034535d05 /bfd
parent24fbeb8dc2c20f86c9940cc62e6af192a9d11b1a (diff)
downloadgdb-ee3b52e917c3a19850232a6a20f5698090619fc6.zip
gdb-ee3b52e917c3a19850232a6a20f5698090619fc6.tar.gz
gdb-ee3b52e917c3a19850232a6a20f5698090619fc6.tar.bz2
Assign file position for .strtab only if needed
bfd/ PR ld/17773 * elflink.c (bfd_elf_final_link): Assign the file position for the symbol string table only there are symbols to be emitted. ld/testsuite/ PR ld/17773 * ld-elf/binutils.exp (binutils_test): Add an optional readelf_options. Replace -l with $readelf_options. Add a gap test. * ld/testsuite/ld-elf/gap.s: New file.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elflink.c38
2 files changed, 26 insertions, 18 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index b883d3c..02b1ef7 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2014-12-30 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/17773
+ * elflink.c (bfd_elf_final_link): Assign the file position for
+ the symbol string table only there are symbols to be emitted.
+
2014-12-28 Alan Modra <amodra@gmail.com>
PR 17766
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 16421cf..1ceb9e5 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -10614,7 +10614,6 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
unsigned int i;
Elf_Internal_Shdr *symtab_hdr;
Elf_Internal_Shdr *symtab_shndx_hdr;
- Elf_Internal_Shdr *symstrtab_hdr;
const struct elf_backend_data *bed = get_elf_backend_data (abfd);
struct elf_outext_info eoinfo;
bfd_boolean merged;
@@ -11315,25 +11314,28 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
}
- /* Finish up and write out the symbol string table (.strtab)
- section. */
- symstrtab_hdr = &elf_tdata (abfd)->strtab_hdr;
- /* sh_name was set in prep_headers. */
- symstrtab_hdr->sh_type = SHT_STRTAB;
- symstrtab_hdr->sh_flags = 0;
- symstrtab_hdr->sh_addr = 0;
- symstrtab_hdr->sh_size = _bfd_stringtab_size (flinfo.symstrtab);
- symstrtab_hdr->sh_entsize = 0;
- symstrtab_hdr->sh_link = 0;
- symstrtab_hdr->sh_info = 0;
- /* sh_offset is set just below. */
- symstrtab_hdr->sh_addralign = 1;
-
- off = _bfd_elf_assign_file_position_for_section (symstrtab_hdr, off, TRUE);
- elf_next_file_pos (abfd) = off;
-
if (bfd_get_symcount (abfd) > 0)
{
+ /* Finish up and write out the symbol string table (.strtab)
+ section. */
+ Elf_Internal_Shdr *symstrtab_hdr;
+
+ symstrtab_hdr = &elf_tdata (abfd)->strtab_hdr;
+ /* sh_name was set in prep_headers. */
+ symstrtab_hdr->sh_type = SHT_STRTAB;
+ symstrtab_hdr->sh_flags = 0;
+ symstrtab_hdr->sh_addr = 0;
+ symstrtab_hdr->sh_size = _bfd_stringtab_size (flinfo.symstrtab);
+ symstrtab_hdr->sh_entsize = 0;
+ symstrtab_hdr->sh_link = 0;
+ symstrtab_hdr->sh_info = 0;
+ /* sh_offset is set just below. */
+ symstrtab_hdr->sh_addralign = 1;
+
+ off = _bfd_elf_assign_file_position_for_section (symstrtab_hdr,
+ off, TRUE);
+ elf_next_file_pos (abfd) = off;
+
if (bfd_seek (abfd, symstrtab_hdr->sh_offset, SEEK_SET) != 0
|| ! _bfd_stringtab_emit (abfd, flinfo.symstrtab))
return FALSE;