ELF: don't re-order SHF_FILE symbols
authorJan Beulich <jbeulich@novell.com>
Tue, 8 Dec 2015 09:11:58 +0000 (10:11 +0100)
committerJan Beulich <jbeulich@suse.com>
Tue, 8 Dec 2015 09:11:58 +0000 (10:11 +0100)
.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.

gas/ChangeLog
gas/config/obj-elf.c
gas/testsuite/ChangeLog
gas/testsuite/gas/elf/elf.exp
gas/testsuite/gas/elf/file-2.d [new file with mode: 0644]
gas/testsuite/gas/elf/file-2.s [new file with mode: 0644]
gas/testsuite/gas/elf/file.d
gas/testsuite/gas/i386/ilp32/elf/file.d

index 6fb81a1..53a618d 100644 (file)
@@ -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
index 031fafb..f930dc6 100644 (file)
@@ -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
index c514be7..bc524e9 100644 (file)
@@ -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
index fc81da1..99292d7 100644 (file)
@@ -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 (file)
index 0000000..5da114c
--- /dev/null
@@ -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 (file)
index 0000000..4080034
--- /dev/null
@@ -0,0 +1,7 @@
+       .file "file-2.s"
+       .text
+local1:
+       .file "aux-1.s"
+local2:
+       .file "aux-2.s"
+local3:
index 1e98186..9b7bb4f 100644 (file)
@@ -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
index 9394c0c..57c45d7 100644 (file)
@@ -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