Hallo! Diffing the make log of a build of GCC with SHELL not explicitly set (thus /bin/sh, which is bash) and one with SHELL=/bin/dash, I found the following unexpected difference:
-checking assembler for eh_frame optimization... yes
+checking assembler for eh_frame optimization... buggy
This is from gcc/configure; which invokes
acinclude.m4:gcc_GAS_CHECK_FEATURE for the ``eh_frame optimization''
check.
Latter case, gcc/config.log:
configure:22282: checking assembler for eh_frame optimization
configure:22327: /usr/bin/as --32 -o conftest.o conftest.s >&5
conftest.s: Assembler messages:
conftest.s: Warning: end of file in string; '"' inserted
conftest.s:13: Warning: unterminated string; newline inserted
There, the following happens:
$ sh # This is bash.
sh-4.1$ echo '.ascii "z\0"'
.ascii "z\0"
This is what GCC expects. However, with dash:
$ dash
$ echo '.ascii "z\0"'
.ascii "z
The backslash escape and everything after is cut off.
The test in gcc/configure.ac:
gcc_GAS_CHECK_FEATURE(eh_frame optimization, gcc_cv_as_eh_frame,
[elf,2,12,0],,
[ .text
[...]
.byte 0x1
.ascii "z\0"
.byte 0x1
[...]
As quickly determined in #gcc with Ian's and Ismail's help, this is
unportable usage of the echo builtin (and also at least questionable for
/bin/echo), so I'm suggesting the following simple fix:
gcc/
* configure.ac (eh_frame optimization): Avoid unportable shell feature.
diff --git a/gcc/configure.ac b/gcc/configure.ac
index c2163bf..73f0209 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -2538,7 +2538,7 @@ __FRAME_BEGIN__:
.LSCIE1:
.4byte 0x0
.byte 0x1
- .ascii "z\0"
+ .asciz "z"
.byte 0x1
.byte 0x78
.byte 0x1a
Alternatively, gcc_GAS_CHECK_FEATURE could be changed to emit the
temporary file by using a shell here-doc, which is what AC_TRY_COMPILE is
doing, for example.
Grüße,
Thomas
pgpoH48Y3yGDm.pgp
Description: PGP signature
