diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2014-12-30 19:09:11 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2014-12-30 19:09:11 -0800 |
commit | ee3b52e917c3a19850232a6a20f5698090619fc6 (patch) | |
tree | bbc97bb0c5f38fad65e38ce93a23a6d034535d05 /bfd | |
parent | 24fbeb8dc2c20f86c9940cc62e6af192a9d11b1a (diff) | |
download | gdb-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/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/elflink.c | 38 |
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; |