|
Message-ID: <CAJ4e7SWqTAJUxyXE8ZtSUzsQtAsEHZjJiEcoS_AmO2sNoFZ7vA@mail.gmail.com> 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.