aboutsummaryrefslogtreecommitdiff
path: root/binutils
diff options
context:
space:
mode:
Diffstat (limited to 'binutils')
-rw-r--r--binutils/ChangeLog16
-rw-r--r--binutils/objcopy.c24
-rw-r--r--binutils/testsuite/binutils-all/readelf.exp6
-rw-r--r--binutils/testsuite/binutils-all/readelf.s-642
-rw-r--r--binutils/testsuite/binutils-all/readelf.s-64-unused27
-rw-r--r--binutils/testsuite/binutils-all/readelf.ss5
-rw-r--r--binutils/testsuite/binutils-all/readelf.ss-645
-rw-r--r--binutils/testsuite/binutils-all/readelf.ss-64-unused18
-rw-r--r--binutils/testsuite/binutils-all/readelf.ss-unused20
-rw-r--r--binutils/testsuite/lib/binutils-common.exp31
10 files changed, 144 insertions, 10 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index c3b21c6..c308759 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,19 @@
+2021-01-07 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR 27109
+ * objcopy.c (copy_object): Handle section symbols for
+ non-relocatable inputs.
+ * testsuite/binutils-all/readelf.exp (readelf_test): Check
+ is_elf_unused_section_symbols.
+ * testsuite/binutils-all/readelf.s-64: Updated.
+ * testsuite/binutils-all/readelf.ss: Likewise.
+ * testsuite/binutils-all/readelf.ss-64: Likewise.
+ * testsuite/binutils-all/readelf.s-64-unused: New file.
+ * testsuite/binutils-all/readelf.ss-64-unused: Likewise.
+ * testsuite/binutils-all/readelf.ss-unused: Likewise.
+ * testsuite/lib/binutils-common.exp
+ (is_elf_unused_section_symbols): New proc.
+
2021-01-06 Reuben Thomas <rrt@sc3d.org>
* binutils/readelf.c: Correct grammar in comment.
diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index 560e7c6..62ee222 100644
--- a/binutils/objcopy.c
+++ b/binutils/objcopy.c
@@ -3204,6 +3204,30 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
if (convert_debugging)
dhandle = read_debugging_info (ibfd, isympp, symcount, FALSE);
+ if ((obfd->flags & (EXEC_P | DYNAMIC)) != 0
+ && (obfd->flags & HAS_RELOC) == 0)
+ {
+ if (bfd_keep_unused_section_symbols (obfd))
+ {
+ /* Non-relocatable inputs may not have the unused section
+ symbols. Mark all section symbols as used to generate
+ section symbols. */
+ asection *asect;
+ for (asect = obfd->sections; asect != NULL; asect = asect->next)
+ if (asect->symbol)
+ asect->symbol->flags |= BSF_SECTION_SYM_USED;
+ }
+ else
+ {
+ /* Non-relocatable inputs may have the unused section symbols.
+ Mark all section symbols as unused to excluded them. */
+ long s;
+ for (s = 0; s < symcount; s++)
+ if ((isympp[s]->flags & BSF_SECTION_SYM_USED))
+ isympp[s]->flags &= ~BSF_SECTION_SYM_USED;
+ }
+ }
+
if (strip_symbols == STRIP_DEBUG
|| strip_symbols == STRIP_ALL
|| strip_symbols == STRIP_UNNEEDED
diff --git a/binutils/testsuite/binutils-all/readelf.exp b/binutils/testsuite/binutils-all/readelf.exp
index 4834233..51d26b7 100644
--- a/binutils/testsuite/binutils-all/readelf.exp
+++ b/binutils/testsuite/binutils-all/readelf.exp
@@ -100,7 +100,11 @@ proc readelf_test { options binary_file regexp_file xfails } {
return
}
- set target_machine ""
+ if { [is_elf_unused_section_symbols ] } {
+ set target_machine unused
+ } else {
+ set target_machine ""
+ }
if [istarget "mips*-*-*"] then {
if [is_bad_symtab] then {
set target_machine mips
diff --git a/binutils/testsuite/binutils-all/readelf.s-64 b/binutils/testsuite/binutils-all/readelf.s-64
index a1e6cd1..5582d77 100644
--- a/binutils/testsuite/binutils-all/readelf.s-64
+++ b/binutils/testsuite/binutils-all/readelf.s-64
@@ -18,7 +18,7 @@ Section Headers:
+\[ .\] .symtab +SYMTAB +0000000000000000 +0+.*
# aarch64-elf targets have one more data symbol.
# x86 targets may have .note.gnu.property.
- +0+.* +0000000000000018 +(6|7) +(6|7) +8
+ +0+.* +0000000000000018 +(6|7) +(3|4) +8
+\[ .\] .strtab +STRTAB +0000000000000000 +0+.*
+0+.* +0000000000000000 .* +0 +0 +1
+\[ .\] .shstrtab +STRTAB +0000000000000000 +[0-9a-f]+
diff --git a/binutils/testsuite/binutils-all/readelf.s-64-unused b/binutils/testsuite/binutils-all/readelf.s-64-unused
new file mode 100644
index 0000000..a1e6cd1
--- /dev/null
+++ b/binutils/testsuite/binutils-all/readelf.s-64-unused
@@ -0,0 +1,27 @@
+There are .* section headers, starting at offset .*:
+
+Section Headers:
+ +\[Nr\] Name +Type +Address +Offset
+ +Size +EntSize +Flags +Link +Info +Align
+ +\[ 0\] +NULL +0000000000000000 +00000000
+ +0000000000000000 +0000000000000000 +0 +0 +0
+ +\[ 1\] .text +PROGBITS +0000000000000000 +00000040
+ +00000000000000.. +0000000000000000 +AX +0 +0 +.*
+ +\[ 2\] .rel.+text +REL. +0+ +0+.*
+ +000000000000001. +000000000000001. +I +. +1 +8
+ +\[ 3\] .data +PROGBITS +0000000000000000 +000000(48|50)
+ +000000000000000[48] +0000000000000000 +WA +0 +0 +.*
+ +\[ 4\] .bss +NOBITS +0000000000000000 +000000(4c|50|54|58)
+ +0000000000000000 +0000000000000000 +WA +0 +0 +.*
+# x86 targets may put .note.gnu.property here.
+#...
+ +\[ .\] .symtab +SYMTAB +0000000000000000 +0+.*
+# aarch64-elf targets have one more data symbol.
+# x86 targets may have .note.gnu.property.
+ +0+.* +0000000000000018 +(6|7) +(6|7) +8
+ +\[ .\] .strtab +STRTAB +0000000000000000 +0+.*
+ +0+.* +0000000000000000 .* +0 +0 +1
+ +\[ .\] .shstrtab +STRTAB +0000000000000000 +[0-9a-f]+
+ +00000000000000.. +0000000000000000 .* +0 +0 +.*
+Key to Flags:
+#...
diff --git a/binutils/testsuite/binutils-all/readelf.ss b/binutils/testsuite/binutils-all/readelf.ss
index acc6d93..5fbb5d0 100644
--- a/binutils/testsuite/binutils-all/readelf.ss
+++ b/binutils/testsuite/binutils-all/readelf.ss
@@ -2,10 +2,7 @@
Symbol table '.symtab' contains .* entries:
+Num: +Value +Size +Type +Bind +Vis +Ndx +Name
+0: 00000000 +0 +NOTYPE +LOCAL +DEFAULT +UND
- +1: 00000000 +0 +SECTION +LOCAL +DEFAULT +1
- +2: 00000000 +0 +SECTION +LOCAL +DEFAULT +[34]
- +3: 00000000 +0 +SECTION +LOCAL +DEFAULT +[45]
- +4: 00000000 +0 +NOTYPE +LOCAL +DEFAULT +1 static_text_symbol
+ +1: 00000000 +0 +NOTYPE +LOCAL +DEFAULT +1 static_text_symbol
# ARM targets add the $d mapping symbol here...
# NDS32 targets add the $d2 mapping symbol here...
#...
diff --git a/binutils/testsuite/binutils-all/readelf.ss-64 b/binutils/testsuite/binutils-all/readelf.ss-64
index bd10cab..99a732f 100644
--- a/binutils/testsuite/binutils-all/readelf.ss-64
+++ b/binutils/testsuite/binutils-all/readelf.ss-64
@@ -2,10 +2,7 @@
Symbol table '.symtab' contains .* entries:
+Num: +Value +Size +Type +Bind +Vis +Ndx +Name
+0: 0000000000000000 +0 +NOTYPE +LOCAL +DEFAULT +UND
- +1: 0000000000000000 +0 +SECTION +LOCAL +DEFAULT +1
- +2: 0000000000000000 +0 +SECTION +LOCAL +DEFAULT +3
- +3: 0000000000000000 +0 +SECTION +LOCAL +DEFAULT +4
- +4: 0000000000000000 +0 +NOTYPE +LOCAL +DEFAULT +1 static_text_symbol
+ +1: 0000000000000000 +0 +NOTYPE +LOCAL +DEFAULT +1 static_text_symbol
# aarch64-elf targets add the $d mapping symbol here...
#...
+.: 0000000000000000 +0 +NOTYPE +LOCAL +DEFAULT +3 static_data_symbol
diff --git a/binutils/testsuite/binutils-all/readelf.ss-64-unused b/binutils/testsuite/binutils-all/readelf.ss-64-unused
new file mode 100644
index 0000000..bd10cab
--- /dev/null
+++ b/binutils/testsuite/binutils-all/readelf.ss-64-unused
@@ -0,0 +1,18 @@
+
+Symbol table '.symtab' contains .* entries:
+ +Num: +Value +Size +Type +Bind +Vis +Ndx +Name
+ +0: 0000000000000000 +0 +NOTYPE +LOCAL +DEFAULT +UND
+ +1: 0000000000000000 +0 +SECTION +LOCAL +DEFAULT +1
+ +2: 0000000000000000 +0 +SECTION +LOCAL +DEFAULT +3
+ +3: 0000000000000000 +0 +SECTION +LOCAL +DEFAULT +4
+ +4: 0000000000000000 +0 +NOTYPE +LOCAL +DEFAULT +1 static_text_symbol
+# aarch64-elf targets add the $d mapping symbol here...
+#...
+ +.: 0000000000000000 +0 +NOTYPE +LOCAL +DEFAULT +3 static_data_symbol
+# ... or here ...
+#...
+.* +.: 0000000000000000 +0 +NOTYPE +GLOBAL +DEFAULT +1 text_symbol
+ +.: 0000000000000000 +0 +NOTYPE +GLOBAL +DEFAULT +UND external_symbol
+ +.: 0000000000000000 +0 +NOTYPE +GLOBAL +DEFAULT +3 data_symbol
+ +[0-9]+: 0000000000000004 +4 +(COMMON|OBJECT) +GLOBAL +DEFAULT +COM common_symbol
+#pass
diff --git a/binutils/testsuite/binutils-all/readelf.ss-unused b/binutils/testsuite/binutils-all/readelf.ss-unused
new file mode 100644
index 0000000..acc6d93
--- /dev/null
+++ b/binutils/testsuite/binutils-all/readelf.ss-unused
@@ -0,0 +1,20 @@
+
+Symbol table '.symtab' contains .* entries:
+ +Num: +Value +Size +Type +Bind +Vis +Ndx +Name
+ +0: 00000000 +0 +NOTYPE +LOCAL +DEFAULT +UND
+ +1: 00000000 +0 +SECTION +LOCAL +DEFAULT +1
+ +2: 00000000 +0 +SECTION +LOCAL +DEFAULT +[34]
+ +3: 00000000 +0 +SECTION +LOCAL +DEFAULT +[45]
+ +4: 00000000 +0 +NOTYPE +LOCAL +DEFAULT +1 static_text_symbol
+# ARM targets add the $d mapping symbol here...
+# NDS32 targets add the $d2 mapping symbol here...
+#...
+ +.: 00000000 +0 +NOTYPE +LOCAL +DEFAULT +[34] static_data_symbol
+# v850 targets include extra SECTION symbols here for the .call_table_data
+# and .call_table_text sections.
+#...
+ +[0-9]+: 00000000 +0 +NOTYPE +GLOBAL +DEFAULT +1 text_symbol
+ +[0-9]+: 00000000 +0 +NOTYPE +GLOBAL +DEFAULT +UND external_symbol
+ +[0-9]+: 00000000 +0 +NOTYPE +GLOBAL +DEFAULT +[34] data_symbol
+ +[0-9]+: 00000004 +4 +(COMMON|OBJECT) +GLOBAL +DEFAULT +(COM|ANSI_COM) common_symbol
+#...
diff --git a/binutils/testsuite/lib/binutils-common.exp b/binutils/testsuite/lib/binutils-common.exp
index 6552d30..616a6ca 100644
--- a/binutils/testsuite/lib/binutils-common.exp
+++ b/binutils/testsuite/lib/binutils-common.exp
@@ -248,6 +248,37 @@ proc is_generic { } {
return 0
}
+# True if the object format is ELF with unused section symbols.
+proc is_elf_unused_section_symbols {} {
+ global AS ASFLAGS READELF
+
+ if {![info exists elf_unused_section_symbols_saved]} {
+ set elf_unused_section_symbols_saved 1
+ if { [is_elf_format] } {
+ set base "empty[pid]"
+ set src "$base.s"
+ set obj "$base.obj"
+ set f [open $src "w"]
+ close $f
+ set cmd "$AS $ASFLAGS -o $obj $src"
+ send_log "$cmd\n"
+ set cmdret [remote_exec host $cmd]
+ set cmdret [lindex $cmdret 0]
+ if { $cmdret == 0 } {
+ set cmd "$READELF -sW $obj"
+ send_log "$cmd\n"
+ set got [remote_exec host $cmd]
+ if { ![string match "*SECTION*" $got] } {
+ set elf_unused_section_symbols_saved 0
+ }
+ }
+ file delete $obj
+ file delete $src
+ }
+ }
+ return $elf_unused_section_symbols_saved
+}
+
# True if the ELF target supports STB_GNU_UNIQUE.
#
# This require ELFOSABI_GNU, and `bfd_elf_final_link'.