aboutsummaryrefslogtreecommitdiff
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
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.
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elflink.c38
-rw-r--r--ld/testsuite/ChangeLog8
-rw-r--r--ld/testsuite/ld-elf/binutils.exp15
-rw-r--r--ld/testsuite/ld-elf/gap.s4
5 files changed, 47 insertions, 24 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;
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index 6fc0318..49ab015 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2014-12-30 H.J. Lu <hongjiu.lu@intel.com>
+
+ 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.
+
2014-12-26 Alan Modra <amodra@gmail.com>
* ld-sh/sh64/crangerel1.rd: Update.
diff --git a/ld/testsuite/ld-elf/binutils.exp b/ld/testsuite/ld-elf/binutils.exp
index 4ade8cb..37ab6b3 100644
--- a/ld/testsuite/ld-elf/binutils.exp
+++ b/ld/testsuite/ld-elf/binutils.exp
@@ -38,8 +38,9 @@ if { [istarget *-*-linux*aout*]
# to hardwire the test name. This is important if ld_options contains
# absolute path names because the default test name is constructed
# from the prog_name and ld_options and we do not want absolute paths
-# to appear in the test_name.
-proc binutils_test { prog_name ld_options test {test_name ""}} {
+# to appear in the test_name. The optional readelf_options can be
+# used to specify different options for readelf.
+proc binutils_test { prog_name ld_options test {test_name ""} {readelf_options "-l"}} {
global as
global ld
global READELF
@@ -71,8 +72,8 @@ proc binutils_test { prog_name ld_options test {test_name ""}} {
return
}
- send_log "$READELF -l --wide tmpdir/$test > tmpdir/$test.exp\n"
- set got [remote_exec host "$READELF -l --wide tmpdir/$test" "" "/dev/null" "tmpdir/$test.exp"]
+ send_log "$READELF $readelf_options --wide tmpdir/$test > tmpdir/$test.exp\n"
+ set got [remote_exec host "$READELF $readelf_options --wide tmpdir/$test" "" "/dev/null" "tmpdir/$test.exp"]
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
send_log "$got\n"
unresolved "$test_name"
@@ -111,8 +112,8 @@ proc binutils_test { prog_name ld_options test {test_name ""}} {
return
}
- send_log "$READELF -l --wide tmpdir/$test > tmpdir/$test.out\n"
- set got [remote_exec host "$READELF -l --wide tmpdir/$test" "" "/dev/null" "tmpdir/$test.out"]
+ send_log "$READELF $readelf_options --wide tmpdir/$test > tmpdir/$test.out\n"
+ set got [remote_exec host "$READELF $readelf_options --wide tmpdir/$test" "" "/dev/null" "tmpdir/$test.out"]
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
send_log "$got\n"
unresolved "$test_name"
@@ -176,3 +177,5 @@ foreach testitem $tls_tests {
binutils_test objcopy $testopt $testitem
}
}
+
+binutils_test strip "-s" gap "" "-lS"
diff --git a/ld/testsuite/ld-elf/gap.s b/ld/testsuite/ld-elf/gap.s
new file mode 100644
index 0000000..039d26b
--- /dev/null
+++ b/ld/testsuite/ld-elf/gap.s
@@ -0,0 +1,4 @@
+ .text
+ .global _start
+_start:
+ .long 0