From fbdf9406b0589e9b8bbfbbed606f3fff2d060b3c Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Tue, 8 Dec 2015 10:11:58 +0100 Subject: [PATCH] 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. --- gas/ChangeLog | 5 +++++ gas/config/obj-elf.c | 9 ++++++--- gas/testsuite/ChangeLog | 7 +++++++ gas/testsuite/gas/elf/elf.exp | 1 + gas/testsuite/gas/elf/file-2.d | 14 ++++++++++++++ gas/testsuite/gas/elf/file-2.s | 7 +++++++ gas/testsuite/gas/elf/file.d | 18 +++++++++--------- gas/testsuite/gas/i386/ilp32/elf/file.d | 18 +++++++++--------- 8 files changed, 58 insertions(+), 21 deletions(-) create mode 100644 gas/testsuite/gas/elf/file-2.d create mode 100644 gas/testsuite/gas/elf/file-2.s 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 + + * config/obj-elf.c (elf_file_symbol): Tighten condition for + moving BSF_FILE symbols. + 2015-12-08 DJ Delorie * 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 + + * 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 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 -- 2.7.4