aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2016-02-02 03:30:21 -0800
committerH.J. Lu <hjl.tools@gmail.com>2016-02-02 03:30:48 -0800
commit14f2c699ddca1e2f706342dffc59a6c7e23e844c (patch)
tree1c139746a08e92bb640f08145d0ca4f28d696571
parenta143b0045ca8a7024a8515b5dda3ceab5f832e83 (diff)
downloadfsf-binutils-gdb-14f2c699ddca1e2f706342dffc59a6c7e23e844c.zip
fsf-binutils-gdb-14f2c699ddca1e2f706342dffc59a6c7e23e844c.tar.gz
fsf-binutils-gdb-14f2c699ddca1e2f706342dffc59a6c7e23e844c.tar.bz2
Clear HAS_RELOC if there are no relocations
The HAS_RELOC bit should be cleared when relocations are removed from relocatable files. bfd/ PR binutils/19547 * elf.c (assign_section_numbers): Clear HAS_RELOC if there are no relocations in relocatable files. binutils/ PR binutils/19547 * testsuite/binutils-all/objcopy.exp (objcopy_test_without_global_symbol): New proc. Run objcopy_test_without_global_symbol. * testsuite/binutils-all/pr19547.c: New file.
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elf.c9
-rw-r--r--binutils/ChangeLog8
-rw-r--r--binutils/testsuite/binutils-all/objcopy.exp40
-rw-r--r--binutils/testsuite/binutils-all/pr19547.c1
5 files changed, 64 insertions, 0 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 06596f9..898af56 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2016-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR binutils/19547
+ * elf.c (assign_section_numbers): Clear HAS_RELOC if there are
+ no relocations in relocatable files.
+
2016-02-01 H.J. Lu <hongjiu.lu@intel.com>
PR ld/19553
diff --git a/bfd/elf.c b/bfd/elf.c
index 74c2f2d..30112ae9 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -3355,6 +3355,8 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
/* SHT_GROUP sections are in relocatable files only. */
if (link_info == NULL || bfd_link_relocatable (link_info))
{
+ bfd_size_type reloc_count = 0;
+
/* Put SHT_GROUP sections first. */
for (sec = abfd->sections; sec != NULL; sec = sec->next)
{
@@ -3371,7 +3373,14 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
else
d->this_idx = section_number++;
}
+
+ /* Count relocations. */
+ reloc_count += sec->reloc_count;
}
+
+ /* Clear HAS_RELOC if there are no relocations. */
+ if (reloc_count == 0)
+ abfd->flags &= ~HAS_RELOC;
}
for (sec = abfd->sections; sec; sec = sec->next)
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index edc66cd..32bbf9b 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,11 @@
+2016-02-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR binutils/19547
+ * testsuite/binutils-all/objcopy.exp
+ (objcopy_test_without_global_symbol): New proc.
+ Run objcopy_test_without_global_symbol.
+ * testsuite/binutils-all/pr19547.c: New file.
+
2016-01-28 H.J. Lu <hongjiu.lu@intel.com>
PR binutils/19523
diff --git a/binutils/testsuite/binutils-all/objcopy.exp b/binutils/testsuite/binutils-all/objcopy.exp
index 376f3ed..b2c54ea 100644
--- a/binutils/testsuite/binutils-all/objcopy.exp
+++ b/binutils/testsuite/binutils-all/objcopy.exp
@@ -1104,3 +1104,43 @@ if [is_elf_format] {
run_dump_test "exclude-1b"
}
run_dump_test "localize-hidden-2"
+
+# Test objcopying an object file without global symbol
+
+proc objcopy_test_without_global_symbol { } {
+ global OBJCOPY
+ global OBJCOPYFLAGS
+ global OBJDUMP
+ global OBJDUMPFLAGS
+ global srcdir
+ global subdir
+
+ set test "strip without global symbol "
+
+ if { [target_compile $srcdir/$subdir/pr19547.c tmpdir/pr19547.o object debug] != "" } {
+ untested $test
+ return
+ }
+
+ if [is_remote host] {
+ set objfile [remote_download host tmpdir/pr19547.o]
+ } else {
+ set objfile tmpdir/pr19547.o
+ }
+
+ set exec_output [binutils_run $OBJCOPY "$OBJCOPYFLAGS --strip-unneeded $objfile"]
+ if ![string equal "" $exec_output] {
+ fail $test
+ return
+ }
+
+ set exec_output [binutils_run $OBJDUMP "$OBJDUMPFLAGS -t $objfile"]
+ if {![regexp "no symbols" $exec_output]} {
+ fail $test
+ return
+ }
+
+ pass $test
+}
+
+objcopy_test_without_global_symbol
diff --git a/binutils/testsuite/binutils-all/pr19547.c b/binutils/testsuite/binutils-all/pr19547.c
new file mode 100644
index 0000000..4aef486
--- /dev/null
+++ b/binutils/testsuite/binutils-all/pr19547.c
@@ -0,0 +1 @@
+static char foo[]__attribute__ ((used)) = "foo";