Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Mon, 24 Oct 2016 00:20:27 +0200
From: Samuel Sadok <innovation-labs@...install.ch>
To: musl@...ts.openwall.com
Subject: Re: Unable to build with --enable-shared

2016-10-23 18:17 GMT+02:00 Rich Felker <dalias@...c.org>:
> On Sun, Oct 23, 2016 at 02:22:28AM +0200, Samuel Sadok wrote:
>> 2016-10-22 23:58 GMT+02:00 Szabolcs Nagy <nsz@...t70.net>:
>> > * Samuel Sadok <innovation-labs@...install.ch> [2016-10-22 22:37:46 +0200]:
>> >> I am unable to build musl with --enable-shared. Multiple issues in
>> >> unrelated projects (e.g. here: https://bugs.swift.org/browse/SR-1023)
>> >> suggest that the culprit is a change in behaviour between binutils
>> >> 2.25 and 2.26.
>> >>
>> >
>> > that bug is different, that's about object symbols
>> >
>> > (swift seems to misuse protected visibility objects,
>> > and instead of fixing the problem they switched to the
>> > gold linker which does not yet have the bfd linker fix,
>> > such incompetence is frustrating..  however the issue
>> > does not affect musl: we don't mark objects protected
>> > to avoid issues with broken toolchains.)
>>
>> That's precisely why I'm trying to get away from Apple.
>>
>> >
>> >> $ make
>> >> [...]
>> >> x86_64-pc-linux-gnu-gcc  -D_XOPEN_SOURCE=700 -I./arch/x86_64
>> >> -I./arch/generic -Iobj/src/internal -I./src/internal -Iobj/include
>> >> -I./include  -include vis.h -B/usr/local/bin/x86_64-pc-linux-gnu-
>> >> -fPIC -c -o obj/src/process/posix_spawn.lo src/process/posix_spawn.c
>> >
>> > some flags are missing here.. e.g. freestanding flags
>>
>> Thanks for the pointer, that turned out to be the problem.
>>
>> I should mention that I am cross-compiling from macOS. Since I had a
>> Linux VM flying around, I tried to build musl there (success) and
>> compared the logs.
>> Looking at config.mak, there apparently was a serious misconfiguration:
>>
>> config.mak on the cross-build system (macOS):
>>
>> CFLAGS_AUTO = -include vis.h
>> CFLAGS_C99FSE =
>> CFLAGS_MEMOPS =
>> CFLAGS_NOSSP =
>> LDFLAGS_AUTO =
>> LIBCC =
>
> This probably indicates something is wrong with your cross toolchain;
> even if you manually fix config.mak, I would be concerned that
> something might have been built wrong. What cross toolchain are you
> using and how was it setup? How did you invoke configure?
>
> Rich

I managed to track down the problem.

I'm using a cross-toolchain I built from source with a slight
misconfiguration. Specifically, I must tell it where it is
(-B/usr/local/bin/x86_64-pc-linux-gnu-), otherwise it uses the
(incompatible) default linker.

Now when the configure script checks whether some flag is working, it
forgets to pass the user-defined $CFLAGS to the compiler, which then
fails:

tryflag () {
printf "checking whether compiler accepts %s... " "$2"
echo "typedef int x;" > "$tmpc"
if $CC $CFLAGS_TRY $2 -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
[...]

Thus, we end up with no flags at all.

Even though I'm aware that my setup is quite non-standard, I would
consider this a bug in the configure script. I appended a patch that
fixes the problem in all places where I spotted it. Using this patch I
am able to configure and build musl as expected.
Does this seem reasonable to you?



>From 084678f6c93ed0bf305ea0fbb35a33810c4c9ccc Mon Sep 17 00:00:00 2001
From: Samuel Sadok <innovation-labs@...install.ch>
Date: Mon, 24 Oct 2016 00:10:04 +0200
Subject: [PATCH] Pass CFLAGS to compiler under all circumstances in configure
 script

---
 configure | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/configure b/configure
index 707eb12..c1466ce 100755
--- a/configure
+++ b/configure
@@ -72,7 +72,7 @@ echo "typedef int x;" > "$tmpc"
 echo "#if $1" >> "$tmpc"
 echo "#error yes" >> "$tmpc"
 echo "#endif" >> "$tmpc"
-if $CC $2 -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
+if $CC $CFLAGS $2 -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
 printf "false\n"
 return 1
 else
@@ -84,7 +84,7 @@ fi
 tryflag () {
 printf "checking whether compiler accepts %s... " "$2"
 echo "typedef int x;" > "$tmpc"
-if $CC $CFLAGS_TRY $2 -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
+if $CC $CFLAGS $CFLAGS_TRY $2 -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
 printf "yes\n"
 eval "$1=\"\${$1} \$2\""
 eval "$1=\${$1# }"
@@ -98,7 +98,7 @@ fi
 tryldflag () {
 printf "checking whether linker accepts %s... " "$2"
 echo "typedef int x;" > "$tmpc"
-if $CC $LDFLAGS_TRY -nostdlib -shared "$2" -o /dev/null "$tmpc"
>/dev/null 2>&1 ; then
+if $CC $CFLAGS $LDFLAGS_TRY -nostdlib -shared "$2" -o /dev/null
"$tmpc" >/dev/null 2>&1 ; then
 printf "yes\n"
 eval "$1=\"\${$1} \$2\""
 eval "$1=\${$1# }"
@@ -275,7 +275,7 @@ echo "#if ! __GLIBC__" >> "$tmpc"
 echo "#error no" >> "$tmpc"
 echo "#endif" >> "$tmpc"
 printf "checking for toolchain wrapper to build... "
-if test "$wrapper" = auto && ! $CC -c -o /dev/null "$tmpc" >/dev/null
2>&1 ; then
+if test "$wrapper" = auto && ! $CC $CFLAGS -c -o /dev/null "$tmpc"
>/dev/null 2>&1 ; then
 echo "none"
 elif test "$cc_family" = gcc ; then
 gcc_wrapper=yes
@@ -303,7 +303,7 @@ fi
 # Find the target architecture
 #
 printf "checking target system type... "
-test -n "$target" || target=$($CC -dumpmachine 2>/dev/null) || target=unknown
+test -n "$target" || target=$($CC $CFLAGS -dumpmachine 2>/dev/null)
|| target=unknown
 printf "%s\n" "$target"

 #
@@ -397,7 +397,7 @@ test "$debug" = yes && CFLAGS_AUTO=-g
 printf "checking whether we should preprocess assembly to add
debugging information... "
 if fnmatch '-g*|*\ -g*' "$CFLAGS_AUTO $CFLAGS" &&
    test -f "tools/add-cfi.$ARCH.awk" &&
-   printf ".file 1 \"srcfile.s\"\n.line
1\n.cfi_startproc\n.cfi_endproc" | $CC -g -x assembler -c -o /dev/null
2>/dev/null -
+   printf ".file 1 \"srcfile.s\"\n.line
1\n.cfi_startproc\n.cfi_endproc" | $CC $CFLAGS -g -x assembler -c -o
/dev/null 2>/dev/null -
 then
   ADD_CFI=yes
 else
@@ -588,7 +588,7 @@ tryldflag LDFLAGS_AUTO -Wl,-Bsymbolic-functions
 # Find compiler runtime library
 test -z "$LIBCC" && tryldflag LIBCC -lgcc && tryldflag LIBCC -lgcc_eh
 test -z "$LIBCC" && tryldflag LIBCC -lcompiler_rt
-test -z "$LIBCC" && try_libcc=`$CC -print-file-name=libpcc.a 2>/dev/null` \
+test -z "$LIBCC" && try_libcc=`$CC $CFLAGS -print-file-name=libpcc.a
2>/dev/null` \
                  && tryldflag LIBCC "$try_libcc"
 printf "using compiler runtime libraries: %s\n" "$LIBCC"

@@ -719,6 +719,7 @@ printf "creating config.mak... "
 cmdline=$(quote "$0")
 for i ; do cmdline="$cmdline $(quote "$i")" ; done

+
 exec 3>&1 1>config.mak


-- 
2.8.1

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.