From 6f9dbcd42f2cf034a9a21f46842c08d2e88449db Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 10 Apr 2017 15:11:35 +0930 Subject: [PATCH] PR21287, Inconsistent section type for .init_array and .init_array.42 PR21287 notes that .init_array is correctly given a type of SHT_INIT_ARRAY while .init_array.nnn gets SHT_PROGBITS. This patch fixes that problem, and properly drops warnings from the compiler that would cause the testsuite to fail. My a44d0bd78 change to check ld_compile status, necessary to pick up compile errors, also meant warnings were not ignored. bfd/ PR 21287 * elf.c (special_sections_f): Match .fini_array and .fini_array.*. (special_sections_i): Likewise for .init_array. (special_sections_p): Likewise for .preinit_array. ld/ PR 21287 * testsuite/ld-elf/init-fini-arrays.d: Match INIT_ARRAY and FINI_ARRAY. * testsuite/ld-elf/init-fini-arrays.s: Use %init_array and %fini_array section types. * testsuite/lib/ld-lib.exp (default_ld_compile): Trim assembler warnings about "ignoring incorrect section type". (run_ld_link_exec_tests, run_cc_link_tests): Delete old comment. --- bfd/ChangeLog | 7 +++++++ bfd/elf.c | 20 ++++++++++---------- ld/ChangeLog | 10 ++++++++++ ld/testsuite/ld-elf/init-fini-arrays.d | 4 ++-- ld/testsuite/ld-elf/init-fini-arrays.s | 13 +++++++------ ld/testsuite/lib/ld-lib.exp | 11 +++++------ 6 files changed, 41 insertions(+), 24 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index a4664f82b6b..1d8ef2ae5b5 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2017-04-10 Alan Modra + + PR 21287 + * elf.c (special_sections_f): Match .fini_array and .fini_array.*. + (special_sections_i): Likewise for .init_array. + (special_sections_p): Likewise for .preinit_array. + 2017-04-07 H.J. Lu PR ld/19579 diff --git a/bfd/elf.c b/bfd/elf.c index dcb0e6f986a..1f02d429597 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -2601,9 +2601,9 @@ static const struct bfd_elf_special_section special_sections_d[] = static const struct bfd_elf_special_section special_sections_f[] = { - { STRING_COMMA_LEN (".fini"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR }, - { STRING_COMMA_LEN (".fini_array"), 0, SHT_FINI_ARRAY, SHF_ALLOC + SHF_WRITE }, - { NULL, 0, 0, 0, 0 } + { STRING_COMMA_LEN (".fini"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR }, + { STRING_COMMA_LEN (".fini_array"), -2, SHT_FINI_ARRAY, SHF_ALLOC + SHF_WRITE }, + { NULL, 0 , 0, 0, 0 } }; static const struct bfd_elf_special_section special_sections_g[] = @@ -2628,10 +2628,10 @@ static const struct bfd_elf_special_section special_sections_h[] = static const struct bfd_elf_special_section special_sections_i[] = { - { STRING_COMMA_LEN (".init"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR }, - { STRING_COMMA_LEN (".init_array"), 0, SHT_INIT_ARRAY, SHF_ALLOC + SHF_WRITE }, - { STRING_COMMA_LEN (".interp"), 0, SHT_PROGBITS, 0 }, - { NULL, 0, 0, 0, 0 } + { STRING_COMMA_LEN (".init"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR }, + { STRING_COMMA_LEN (".init_array"), -2, SHT_INIT_ARRAY, SHF_ALLOC + SHF_WRITE }, + { STRING_COMMA_LEN (".interp"), 0, SHT_PROGBITS, 0 }, + { NULL, 0, 0, 0, 0 } }; static const struct bfd_elf_special_section special_sections_l[] = @@ -2649,9 +2649,9 @@ static const struct bfd_elf_special_section special_sections_n[] = static const struct bfd_elf_special_section special_sections_p[] = { - { STRING_COMMA_LEN (".preinit_array"), 0, SHT_PREINIT_ARRAY, SHF_ALLOC + SHF_WRITE }, - { STRING_COMMA_LEN (".plt"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR }, - { NULL, 0, 0, 0, 0 } + { STRING_COMMA_LEN (".preinit_array"), -2, SHT_PREINIT_ARRAY, SHF_ALLOC + SHF_WRITE }, + { STRING_COMMA_LEN (".plt"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR }, + { NULL, 0, 0, 0, 0 } }; static const struct bfd_elf_special_section special_sections_r[] = diff --git a/ld/ChangeLog b/ld/ChangeLog index 4255b5e7e5a..4dcfd8136c1 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,13 @@ +2017-04-10 Alan Modra + + PR 21287 + * testsuite/ld-elf/init-fini-arrays.d: Match INIT_ARRAY and FINI_ARRAY. + * testsuite/ld-elf/init-fini-arrays.s: Use %init_array and %fini_array + section types. + * testsuite/lib/ld-lib.exp (default_ld_compile): Trim assembler + warnings about "ignoring incorrect section type". + (run_ld_link_exec_tests, run_cc_link_tests): Delete old comment. + 2017-04-10 Alan Modra * testsuite/ld-elfvsb/elfvsb.exp (visibility_run): Delete diff --git a/ld/testsuite/ld-elf/init-fini-arrays.d b/ld/testsuite/ld-elf/init-fini-arrays.d index 46b536c9c5a..912373d3769 100644 --- a/ld/testsuite/ld-elf/init-fini-arrays.d +++ b/ld/testsuite/ld-elf/init-fini-arrays.d @@ -7,7 +7,7 @@ # well with unique group sections under ld -r. #... - \[[ 0-9]+\] \.init_array\.01000[ \t]+PROGBITS[ \t0-9a-f]+WA?.* + \[[ 0-9]+\] \.init_array\.01000[ \t]+INIT_ARRAY[ \t0-9a-f]+WA?.* #... - \[[ 0-9]+\] \.fini_array\.01000[ \t]+PROGBITS[ \t0-9a-f]+WA?.* + \[[ 0-9]+\] \.fini_array\.01000[ \t]+FINI_ARRAY[ \t0-9a-f]+WA?.* #pass diff --git a/ld/testsuite/ld-elf/init-fini-arrays.s b/ld/testsuite/ld-elf/init-fini-arrays.s index 8f7a3f7bb4d..6740ed6793a 100644 --- a/ld/testsuite/ld-elf/init-fini-arrays.s +++ b/ld/testsuite/ld-elf/init-fini-arrays.s @@ -1,6 +1,7 @@ - .section .init_array.01000,"aw",%progbits - .align 4 - .word 0 - .section .fini_array.01000,"aw",%progbits - .align 4 - .word 0 + .section .init_array.01000,"aw",%init_array + .p2align 2 + .word 0 + + .section .fini_array.01000,"aw",%fini_array + .p2align 2 + .word 0 diff --git a/ld/testsuite/lib/ld-lib.exp b/ld/testsuite/lib/ld-lib.exp index bdce739b66b..b60fcadf058 100644 --- a/ld/testsuite/lib/ld-lib.exp +++ b/ld/testsuite/lib/ld-lib.exp @@ -282,6 +282,11 @@ proc default_ld_compile { cc source object } { remote_file build delete "ld.tmp" remote_file host delete "ld.tmp" set exec_output [prune_warnings $exec_output] + # Versions of gcc up to and including pre-release gcc-7, at least on + # some targets, generate .section directives with incorrect type. + # Ignore warnings from the assembler about this. + regsub -all "(^|\n)\[^\n\]*: ignoring incorrect section type \[^\n\]*" $exec_output "" exec_output + regsub -all "^\[^\n\]*: Assembler messages:\n" $exec_output "" exec_output if [string match "" $exec_output] then { if {![file exists $object]} then { regexp ".*/(\[^/\]*)$" $source all dobj @@ -1421,9 +1426,6 @@ proc run_ld_link_exec_tests { ldtests args } { set objfile "tmpdir/$fileroot.o" lappend objfiles $objfile - # We ignore warnings since some compilers may generate - # incorrect section attributes and the assembler will warn - # them. if { [ string match "c++" $lang ] } { set cmd "$CXX -c $CXXFLAGS $cflags" } else { @@ -1598,9 +1600,6 @@ proc run_cc_link_tests { ldtests } { set objfile "tmpdir/$fileroot.o" lappend objfiles $objfile - # We ignore warnings since some compilers may generate - # incorrect section attributes and the assembler will warn - # them. if { [ string match "c++" $lang ] } { set cmd "$CXX -c $CXXFLAGS $cflags" } else { -- 2.30.2