From: Jan Beulich Date: Tue, 8 Dec 2015 09:11:58 +0000 (+0100) Subject: ELF: don't re-order SHF_FILE symbols X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=fbdf9406b0589e9b8bbfbbed606f3fff2d060b3c;p=binutils-gdb.git 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. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index 6fb81a1acaf..53a618d5035 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 031fafb91b4..f930dc607be 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 c514be7bb51..bc524e94a27 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 fc81da1e4f3..99292d72eb3 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 00000000000..5da114cd223 --- /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 00000000000..40800341d1c --- /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 1e981863549..9b7bb4f1184 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 9394c0c1759..57c45d72599 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