aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@novell.com>2015-12-08 10:11:58 +0100
committerJan Beulich <jbeulich@suse.com>2015-12-08 10:11:58 +0100
commitfbdf9406b0589e9b8bbfbbed606f3fff2d060b3c (patch)
treee3755dd2ed9ecd024559e87127a1d9590a021dfe /gas
parent3685b09fb85dc279762e19df310dc2f30e64b044 (diff)
downloadfsf-binutils-gdb-fbdf9406b0589e9b8bbfbbed606f3fff2d060b3c.zip
fsf-binutils-gdb-fbdf9406b0589e9b8bbfbbed606f3fff2d060b3c.tar.gz
fsf-binutils-gdb-fbdf9406b0589e9b8bbfbbed606f3fff2d060b3c.tar.bz2
ELF: don't re-order SHF_FILE symbols
.file directives may be used to identify the scope of local symbols, the purpose of which gets subverted when re-ordering them. Only allow the first of them to be moved to the first position.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/config/obj-elf.c9
-rw-r--r--gas/testsuite/ChangeLog7
-rw-r--r--gas/testsuite/gas/elf/elf.exp1
-rw-r--r--gas/testsuite/gas/elf/file-2.d14
-rw-r--r--gas/testsuite/gas/elf/file-2.s7
-rw-r--r--gas/testsuite/gas/elf/file.d18
-rw-r--r--gas/testsuite/gas/i386/ilp32/elf/file.d18
8 files changed, 58 insertions, 21 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 6fb81a1..53a618d 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,8 @@
+2015-12-08 Jan Beulich <jbeulich@suse.com>
+
+ * config/obj-elf.c (elf_file_symbol): Tighten condition for
+ moving BSF_FILE symbols.
+
2015-12-08 DJ Delorie <dj@redhat.com>
* config/rl78-parse.y: Make all branches relaxable via
diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c
index 031fafb..f930dc6 100644
--- a/gas/config/obj-elf.c
+++ b/gas/config/obj-elf.c
@@ -282,14 +282,17 @@ elf_file_symbol (const char *s, int appfile)
symbol_get_bfdsym (sym)->flags |= BSF_FILE;
- if (symbol_rootP != sym)
+ if (symbol_rootP != sym
+ && (symbol_rootP->bsym == NULL
+ || !(symbol_rootP->bsym->flags & BSF_FILE)))
{
symbol_remove (sym, &symbol_rootP, &symbol_lastP);
symbol_insert (sym, symbol_rootP, &symbol_rootP, &symbol_lastP);
+ }
+
#ifdef DEBUG
- verify_symbol_chain (symbol_rootP, symbol_lastP);
+ verify_symbol_chain (symbol_rootP, symbol_lastP);
#endif
- }
}
#ifdef NEED_ECOFF_DEBUG
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index c514be7..bc524e9 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2015-12-08 Jan Beulich <jbeulich@suse.com>
+
+ * gas/elf/file-2.s, gas/elf/file-2.d: New.
+ * gas/elf/elf.exp: Run new test.
+ * gas/elf/file.d: Adjust expectations.
+ * gas/i386/ilp32/elf/file.d: Likewise.
+
2015-12-04 Nick Clifton <nickc@redhat.com>
PR gas/19276
diff --git a/gas/testsuite/gas/elf/elf.exp b/gas/testsuite/gas/elf/elf.exp
index fc81da1..99292d7 100644
--- a/gas/testsuite/gas/elf/elf.exp
+++ b/gas/testsuite/gas/elf/elf.exp
@@ -111,6 +111,7 @@ if { [is_elf_format] } then {
run_dump_test "file"
}
}
+ run_dump_test "file-2"
setup_xfail "nds32*-*-*"
run_dump_test "group0a"
run_dump_test "group0b"
diff --git a/gas/testsuite/gas/elf/file-2.d b/gas/testsuite/gas/elf/file-2.d
new file mode 100644
index 0000000..5da114c
--- /dev/null
+++ b/gas/testsuite/gas/elf/file-2.d
@@ -0,0 +1,14 @@
+#objdump: -t
+#name: .file file names ordering
+
+.*: .*
+
+SYMBOL TABLE:
+0+ l[ ]*df \*ABS\*[ ]+0+ file-2\.s
+#...
+0+ l[ ]*\.text[ ]+0+ local1
+0+ l[ ]*df \*ABS\*[ ]+0+ aux-1\.s
+0+ l[ ]*\.text[ ]+0+ local2
+0+ l[ ]*df \*ABS\*[ ]+0+ aux-2\.s
+0+ l[ ]*\.text[ ]+0+ local3
+#pass
diff --git a/gas/testsuite/gas/elf/file-2.s b/gas/testsuite/gas/elf/file-2.s
new file mode 100644
index 0000000..4080034
--- /dev/null
+++ b/gas/testsuite/gas/elf/file-2.s
@@ -0,0 +1,7 @@
+ .file "file-2.s"
+ .text
+local1:
+ .file "aux-1.s"
+local2:
+ .file "aux-2.s"
+local3:
diff --git a/gas/testsuite/gas/elf/file.d b/gas/testsuite/gas/elf/file.d
index 1e98186..9b7bb4f 100644
--- a/gas/testsuite/gas/elf/file.d
+++ b/gas/testsuite/gas/elf/file.d
@@ -4,15 +4,15 @@
.*: .*
SYMBOL TABLE:
+0+ l[ ]*df \*ABS\*[ ]+0+ ~tilde
#...
-0+ l[ ]*df \*ABS\*[ ]+0+ file\.s
-0+ l[ ]*df \*ABS\*[ ]+0+ slash/data
-0+ l[ ]*df \*ABS\*[ ]+0+ \{braces\}
-0+ l[ ]*df \*ABS\*[ ]+0+ \[brackets\]
-0+ l[ ]*df \*ABS\*[ ]+0+ /dir/file\.s
-0+ l[ ]*df \*ABS\*[ ]+0+ :colon
-0+ l[ ]*df \*ABS\*[ ]+0+ UPPER
-0+ l[ ]*df \*ABS\*[ ]+0+ lower
0+ l[ ]*df \*ABS\*[ ]+0+ hash\#
-0+ l[ ]*df \*ABS\*[ ]+0+ ~tilde
+0+ l[ ]*df \*ABS\*[ ]+0+ lower
+0+ l[ ]*df \*ABS\*[ ]+0+ UPPER
+0+ l[ ]*df \*ABS\*[ ]+0+ :colon
+0+ l[ ]*df \*ABS\*[ ]+0+ /dir/file\.s
+0+ l[ ]*df \*ABS\*[ ]+0+ \[brackets\]
+0+ l[ ]*df \*ABS\*[ ]+0+ \{braces\}
+0+ l[ ]*df \*ABS\*[ ]+0+ slash/data
+0+ l[ ]*df \*ABS\*[ ]+0+ file\.s
#pass
diff --git a/gas/testsuite/gas/i386/ilp32/elf/file.d b/gas/testsuite/gas/i386/ilp32/elf/file.d
index 9394c0c..57c45d7 100644
--- a/gas/testsuite/gas/i386/ilp32/elf/file.d
+++ b/gas/testsuite/gas/i386/ilp32/elf/file.d
@@ -5,15 +5,15 @@
.*: .*
SYMBOL TABLE:
+0+ l[ ]*df \*ABS\*[ ]+0+ ~tilde
#...
-0+ l[ ]*df \*ABS\*[ ]+0+ file\.s
-0+ l[ ]*df \*ABS\*[ ]+0+ slash/data
-0+ l[ ]*df \*ABS\*[ ]+0+ \{braces\}
-0+ l[ ]*df \*ABS\*[ ]+0+ \[brackets\]
-0+ l[ ]*df \*ABS\*[ ]+0+ /dir/file\.s
-0+ l[ ]*df \*ABS\*[ ]+0+ :colon
-0+ l[ ]*df \*ABS\*[ ]+0+ UPPER
-0+ l[ ]*df \*ABS\*[ ]+0+ lower
0+ l[ ]*df \*ABS\*[ ]+0+ hash\#
-0+ l[ ]*df \*ABS\*[ ]+0+ ~tilde
+0+ l[ ]*df \*ABS\*[ ]+0+ lower
+0+ l[ ]*df \*ABS\*[ ]+0+ UPPER
+0+ l[ ]*df \*ABS\*[ ]+0+ :colon
+0+ l[ ]*df \*ABS\*[ ]+0+ /dir/file\.s
+0+ l[ ]*df \*ABS\*[ ]+0+ \[brackets\]
+0+ l[ ]*df \*ABS\*[ ]+0+ \{braces\}
+0+ l[ ]*df \*ABS\*[ ]+0+ slash/data
+0+ l[ ]*df \*ABS\*[ ]+0+ file\.s
#pass