Hi, When running the testsuite of grep-3.0 with qemu user mode, some tests fail.
How to reproduce: - On a Debian or Ubuntu system, install package 'g++-5-aarch64-linux-gnu'. - Install qemu-2.8.1 or qemu-2.9.0 from source. - Prepare for executing aarch64 binaries: $ sudo update-binfmts --install qemu-aarch64 $HOME/inst-qemu/2.8.1/bin/qemu-aarch64 --magic '\x7f\x45\x4c\x46\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00' --mask '\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' --offset 0 --credential no $ QEMU_LD_PREFIX=/usr/aarch64-linux-gnu; export QEMU_LD_PREFIX - $ ../configure --host=aarch64-linux CC="aarch64-linux-gnu-gcc-5" - $ make - $ make check Test failure example: filename-lineno.pl: test invalid-re: stderr mismatch, comparing invalid-re.1 (expected) and invalid-re.E (actual) *** invalid-re.1 Thu Jun 29 17:40:54 2017 --- invalid-re.E Thu Jun 29 17:40:54 2017 *************** *** 1 **** ! grep: g:4: Unmatched [... --- 1 ---- ! /tmp/grep-3.0/build-arm64/src/grep: g:4: Unmatched [... How come? The test suite invokes 'grep' from $PATH but: 1) When the x86_64 kernel is about to execute a native aarch64 binary, it prepares an argv with argv[0] = absolute file name of qemu-aarch64 argv[1] = absolute file name of grep (it must be absolute, since it's not qemu's job to search for 'grep' in $PATH). 2) Inside grep, which is linked to glibc, the error() function used is the one from glibc. The one from gnulib, present in grep's source code, is not compiled. The error() function in glibc uses program_invocation_name, which is the absolute path of 'grep' by (1). The error() function in glibc does *not* use program_invocation_short_name, nor does it use gnulib's getprogname() which would also return program_invocation_short_name. The following proof-of-concept patch fixes the problem - "make check" passes -, but I don't know whether - you want something like this at all, - you want to limit it to the test situation. i.e. make the behaviour depend on some environment variable, - you prefer to fix the test suite instead (by removing the dirname of the program from the output before comparison with the expected result). Bruno --- grep-3.0/src/grep.c.bak 2017-02-09 02:37:33.000000000 +0100 +++ grep-3.0/src/grep.c 2017-06-29 18:07:53.072178500 +0200 @@ -2432,6 +2432,15 @@ return result; } +#if __GLIBC__ >= 2 +extern void (*error_print_progname) (void); +static void +error_print_program_invocation_short_name (void) +{ + fprintf (stderr, "%s: ", program_invocation_short_name); +} +#endif + int main (int argc, char **argv) { @@ -2445,6 +2454,10 @@ int fread_errno; intmax_t default_context; FILE *fp; + +#if __GLIBC__ >= 2 + error_print_progname = error_print_program_invocation_short_name; +#endif exit_failure = EXIT_TROUBLE; initialize_main (&argc, &argv);