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/ 2015-12-07 Jan Beulich * config/obj-elf.c (elf_file_symbol): Tighten condition for moving BSF_FILE symbols. gas/testsuite/ 2015-12-07 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-07/gas/config/obj-elf.c +++ 2015-12-07/gas/config/obj-elf.c @@ -282,14 +282,17 @@ elf_file_symbol (const char *s, int appf 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 --- 2015-12-07/gas/testsuite/gas/elf/elf.exp +++ 2015-12-07/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" --- 2015-12-07/gas/testsuite/gas/elf/file-2.d +++ 2015-12-07/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 --- 2015-12-07/gas/testsuite/gas/elf/file-2.s +++ 2015-12-07/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: --- 2015-12-07/gas/testsuite/gas/elf/file.d +++ 2015-12-07/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 --- 2015-12-07/gas/testsuite/gas/i386/ilp32/elf/file.d +++ 2015-12-07/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