From 84df1f9dcb8ef24cc38db4cc0939e99752c4e42b Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Wed, 10 Jun 2020 13:08:15 +0930 Subject: [PATCH] Fix x86 ld testsuite fails with glibc < 2.28 * testsuite/ld-elf/linux-x86.exp: Build tests when non-native. (check_pr25749b): Add optional args. Set expected pass file from args. Run -1b and -2a tests with passall.out. * testsuite/ld-elf/passall.out: New file. * testsuite/ld-elf/pr25749-1.c: Adjust to pass with older glibc. * testsuite/ld-elf/pr25749-2.c: Likewise. * testsuite/lib/ld-lib.exp (run_ld_link_exec_tests): Use regexp_diff to compare expected output from running binary. --- ld/ChangeLog | 11 +++++++++++ ld/testsuite/ld-elf/linux-x86.exp | 22 ++++++++++++---------- ld/testsuite/ld-elf/passall.out | 1 + ld/testsuite/ld-elf/pr25749-1.c | 8 +++++++- ld/testsuite/ld-elf/pr25749-2.c | 8 +++++++- ld/testsuite/lib/ld-lib.exp | 11 +++-------- 6 files changed, 41 insertions(+), 20 deletions(-) create mode 100644 ld/testsuite/ld-elf/passall.out diff --git a/ld/ChangeLog b/ld/ChangeLog index 74636bbb7c8..18fec01e5ab 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,14 @@ +2020-06-10 Alan Modra + + * testsuite/ld-elf/linux-x86.exp: Build tests when non-native. + (check_pr25749b): Add optional args. Set expected pass file + from args. Run -1b and -2a tests with passall.out. + * testsuite/ld-elf/passall.out: New file. + * testsuite/ld-elf/pr25749-1.c: Adjust to pass with older glibc. + * testsuite/ld-elf/pr25749-2.c: Likewise. + * testsuite/lib/ld-lib.exp (run_ld_link_exec_tests): Use + regexp_diff to compare expected output from running binary. + 2020-06-10 H.J. Lu PR ld/26094 diff --git a/ld/testsuite/ld-elf/linux-x86.exp b/ld/testsuite/ld-elf/linux-x86.exp index eeaf4590e38..aae75d443fe 100644 --- a/ld/testsuite/ld-elf/linux-x86.exp +++ b/ld/testsuite/ld-elf/linux-x86.exp @@ -48,10 +48,6 @@ run_ld_link_tests [list \ ] # Test very simple native Linux/x86 programs with linux-x86.S. -if { ![isnative] || ![check_compiler_available] } { - return -} - run_ld_link_exec_tests [list \ [list \ "Run PR ld/23428 test" \ @@ -215,7 +211,7 @@ if { [istarget "i?86-*-linux*"] } { } } -proc check_pr25749b {testname srcfilea srcfileb cflags ldflags dsoldflags} { +proc check_pr25749b {testname srcfilea srcfileb cflags ldflags dsoldflags args} { global objcopy global srcdir global subdir @@ -253,6 +249,12 @@ proc check_pr25749b {testname srcfilea srcfileb cflags ldflags dsoldflags} { "lib${testname}.so" \ ] \ ] + + set pass "pass.out" + if { [llength $args] > 0 } { + set pass [lindex $args 0] + } + run_ld_link_exec_tests [list \ [list \ "Run ${testname}b ($ldflags $cflags)" \ @@ -260,7 +262,7 @@ proc check_pr25749b {testname srcfilea srcfileb cflags ldflags dsoldflags} { "" \ [list $srcfilea]\ "${testname}b" \ - "pass.out" \ + "$pass" \ "$cflags -I../bfd" \ ] \ ] @@ -269,13 +271,13 @@ proc check_pr25749b {testname srcfilea srcfileb cflags ldflags dsoldflags} { check_pr25749b "pr25749-1a" "pr25749-1.c" "pr25749-1a.c" "$NOPIE_CFLAGS" "$NOPIE_LDFLAGS" "" check_pr25749b "pr25749-1a" "pr25749-1.c" "pr25749-1a.c" "-fPIE" "-pie" "" check_pr25749b "pr25749-1a" "pr25749-1.c" "pr25749-1a.c" "-fPIE" "-pie" "-Wl,-Bsymbolic" -check_pr25749b "pr25749-1b" "pr25749-1.c" "pr25749-1b.c" "$NOPIE_CFLAGS" "$NOPIE_LDFLAGS" "" -check_pr25749b "pr25749-1b" "pr25749-1.c" "pr25749-1b.c" "-fPIE" "-pie" "" +check_pr25749b "pr25749-1b" "pr25749-1.c" "pr25749-1b.c" "$NOPIE_CFLAGS" "$NOPIE_LDFLAGS" "" "passall.out" +check_pr25749b "pr25749-1b" "pr25749-1.c" "pr25749-1b.c" "-fPIE" "-pie" "" "passall.out" check_pr25749b "pr25749-1b" "pr25749-1.c" "pr25749-1b.c" "-fPIE" "-pie" "-Wl,-Bsymbolic" check_pr25749b "pr25749-1d" "pr25749-1.c" "pr25749-1d.c" "$NOPIE_CFLAGS" "$NOPIE_LDFLAGS" "-Wl,-defsym=_begin=0" check_pr25749b "pr25749-1d" "pr25749-1.c" "pr25749-1d.c" "-fPIE" "-pie" "-Wl,-defsym=_begin=0" check_pr25749b "pr25749-1d" "pr25749-1.c" "pr25749-1d.c" "-fPIE" "-pie" "-Wl,-Bsymbolic -Wl,-defsym=_begin=0" -check_pr25749b "pr25749-2a" "pr25749-2.c" "pr25749-2a.s" "$NOPIE_CFLAGS" "$NOPIE_LDFLAGS" "" -check_pr25749b "pr25749-2a" "pr25749-2.c" "pr25749-2a.s" "-fPIE" "-pie" "" +check_pr25749b "pr25749-2a" "pr25749-2.c" "pr25749-2a.s" "$NOPIE_CFLAGS" "$NOPIE_LDFLAGS" "" "passall.out" +check_pr25749b "pr25749-2a" "pr25749-2.c" "pr25749-2a.s" "-fPIE" "-pie" "" "passall.out" check_pr25749b "pr25749-2b" "pr25749-2.c" "pr25749-2b.s" "$NOPIE_CFLAGS" "$NOPIE_LDFLAGS" "" check_pr25749b "pr25749-2b" "pr25749-2.c" "pr25749-2b.s" "-fPIE" "-pie" "" diff --git a/ld/testsuite/ld-elf/passall.out b/ld/testsuite/ld-elf/passall.out new file mode 100644 index 00000000000..beec04bc6bc --- /dev/null +++ b/ld/testsuite/ld-elf/passall.out @@ -0,0 +1 @@ +PASS.* diff --git a/ld/testsuite/ld-elf/pr25749-1.c b/ld/testsuite/ld-elf/pr25749-1.c index 5b37af08c69..12d0574a013 100644 --- a/ld/testsuite/ld-elf/pr25749-1.c +++ b/ld/testsuite/ld-elf/pr25749-1.c @@ -6,7 +6,13 @@ extern intptr_t size (void); int main () { - if (size () == 147) + if (size () == 303 /* size of this file */) printf ("PASS\n"); +#ifdef __GLIBC_PREREQ +# if !__GLIBC_PREREQ (2, 28) + else + printf ("PASS (incorrect result due to glibc bug)\n"); +# endif +#endif return 0; } diff --git a/ld/testsuite/ld-elf/pr25749-2.c b/ld/testsuite/ld-elf/pr25749-2.c index 820bebc1673..3ef6f0c6a7b 100644 --- a/ld/testsuite/ld-elf/pr25749-2.c +++ b/ld/testsuite/ld-elf/pr25749-2.c @@ -6,7 +6,13 @@ extern intptr_t size; int main () { - if (size == 137) + if (size == 293 /* size of this file */) printf ("PASS\n"); +#ifdef __GLIBC_PREREQ +# if !__GLIBC_PREREQ (2, 28) + else + printf ("PASS (incorrect result due to glibc bug)\n"); +# endif +#endif return 0; } diff --git a/ld/testsuite/lib/ld-lib.exp b/ld/testsuite/lib/ld-lib.exp index 6535881dd1f..a949437cea3 100644 --- a/ld/testsuite/lib/ld-lib.exp +++ b/ld/testsuite/lib/ld-lib.exp @@ -773,14 +773,9 @@ proc run_ld_link_exec_tests { ldtests args } { verbose "$exec_output" 1 set failed 1 } else { - send_log "diff $binfile.out $srcdir/$subdir/$expfile\n" - verbose "diff $binfile.out $srcdir/$subdir/$expfile" - catch "exec diff $binfile.out $srcdir/$subdir/$expfile" exec_output - set exec_output [prune_warnings $exec_output] - - if ![string match "" $exec_output] then { - send_log "$exec_output\n" - verbose "$exec_output" 1 + send_log [file_contents $binfile.out] + verbose [file_contents $binfile.out] 2 + if [regexp_diff "$binfile.out" "$srcdir/$subdir/$expfile"] { set failed 1 } } -- 2.30.2