[Buildroot] [PATCH] toolchain: improve musl check to support static toolchains

Yann E. MORIN yann.morin.1998 at free.fr
Sat Jul 7 11:56:17 UTC 2018


On 2018-07-06 00:25 +0200, Arnout Vandecappelle spake thusly:
> 
> 
> On 04-07-18 23:42, Thomas Petazzoni wrote:
> > The check_musl function currently builds a program and verifies if the
> > program interpreter starts with /lib/ld-musl. While this works fine
> > for dynamically linked programs, this obviously doesn't work for a
> > purely static musl toolchain such as [1].
> > 
> > There is no easy way to identify a toolchain as using the musl C
> > library. For glibc, dynamic linking is always supported, so we look at
> > the dynamic linker name. For uClibc, there is a distinctive
> > uClibc_config.h header file. There is no such distinctive feature in
> > musl.
> > 
> > We end up resorting to looking for the string MUSL_LOCPATH, which is
> > used by musl locale_map.c source file. This string has been present in
> > musl since 2014. It certainly isn't a very stable or convincing
> > solution to identify the C library as being musl, but it's the best we
> > could find.
> 
>  Well, the most obvious indicator is the output of gcc -dumpmachine... Is there
> any reason why we wouldn't be able to treat that as reliable? AFAIU, hundreds of
> autotools package will fail if the dumpmachine tuple is not something sane...

Does that still output the correct tupple for multilib toolchains?

For example, the mips-2016.05-8-mips-linux-gnu-i686-pc-linux-gnu.tar.bz2
toolchain is a big-multi-lib toolchain, with both glibc and uclibc, but
it always returns mips-linux-gnu, even when either is explicitly
requested:

    $ ./mips-2016.05/bin/mips-linux-gnu-gcc -dumpmachine
    mips-linux-gnu
    $ ./mips-2016.05/bin/mips-linux-gnu-gcc -mglibc -dumpmachine
    mips-linux-gnu
    $ ./mips-2016.05/bin/mips-linux-gnu-gcc -muclibc -dumpmachine
    mips-linux-gnu

So that unfortunately does not work... :-(

Regards,
Yann E. MORIN.

>  BTW, we do all these checks for libc etc., but we don't even check for the
> architecture... E.g. trying to use an arm compiler with BR2_armeb gives the
> rather unhelpful:
> 
> Cannot execute cross-compiler '.../opt/ext-toolchain/bin/armeb-linux-gcc.br_real'
> 
> So, if you're a little bit savvy, you notice that the toolchain prefix is wrong,
> so you set BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX to arm-linux- instead of
> $(ARCH)-linux. And it all works! Happily generating little-endian binaries...
> 
>  Bottom line: perhaps we should just check the tuple. That way we check the
> arch, we check that it's a hosted linux toolchain, we check libc, and we can
> even check the ARM ABI, all in one fell swoop...
> 
>  Regards,
>  Arnout
> 
> > 
> > Note that we are sure there is a libc.a file, because the
> > check_unusable_toolchain function checks that there is a such a file.
> > 
> > [1] http://autobuild.buildroot.net/toolchains/tarballs/br-arm-musl-static-2018.05.tar.bz2
> > 
> > Signed-off-by: Thomas Petazzoni <thomas.petazzoni at bootlin.com>
> > ---
> >  toolchain/helpers.mk                                   | 9 +++------
> >  toolchain/toolchain-external/pkg-toolchain-external.mk | 3 +--
> >  2 files changed, 4 insertions(+), 8 deletions(-)
> > 
> > diff --git a/toolchain/helpers.mk b/toolchain/helpers.mk
> > index 1792286add..e5520c00c3 100644
> > --- a/toolchain/helpers.mk
> > +++ b/toolchain/helpers.mk
> > @@ -241,14 +241,11 @@ check_glibc = \
> >  # $2: cross-readelf path
> >  check_musl = \
> >  	__CROSS_CC=$(strip $1) ; \
> > -	__CROSS_READELF=$(strip $2) ; \
> > -	echo 'void main(void) {}' | $${__CROSS_CC} -x c -o $(BUILD_DIR)/.br-toolchain-test.tmp - >/dev/null 2>&1; \
> > -	if ! $${__CROSS_READELF} -l $(BUILD_DIR)/.br-toolchain-test.tmp 2> /dev/null | grep 'program interpreter: /lib/ld-musl' -q; then \
> > -		rm -f $(BUILD_DIR)/.br-toolchain-test.tmp*; \
> > +	libc_a_path=`$${__CROSS_CC} -print-file-name=libc.a` ; \
> > +	if ! strings $${libc_a_path} | grep -q MUSL_LOCPATH ; then \
> >  		echo "Incorrect selection of the C library" ; \
> >  		exit -1; \
> > -	fi ; \
> > -	rm -f $(BUILD_DIR)/.br-toolchain-test.tmp*
> > +	fi
> >  
> >  #
> >  # Check the conformity of Buildroot configuration with regard to the
> > diff --git a/toolchain/toolchain-external/pkg-toolchain-external.mk b/toolchain/toolchain-external/pkg-toolchain-external.mk
> > index 8b2c283654..02d992531d 100644
> > --- a/toolchain/toolchain-external/pkg-toolchain-external.mk
> > +++ b/toolchain/toolchain-external/pkg-toolchain-external.mk
> > @@ -557,8 +557,7 @@ define $(2)_CONFIGURE_CMDS
> >  		$$(call check_uclibc,$$$${SYSROOT_DIR}) ; \
> >  	elif test "$$(BR2_TOOLCHAIN_EXTERNAL_MUSL)" = "y" ; then \
> >  		$$(call check_musl,\
> > -			"$$(TOOLCHAIN_EXTERNAL_CC) $$(TOOLCHAIN_EXTERNAL_CFLAGS)",\
> > -			$$(TOOLCHAIN_EXTERNAL_READELF)) ; \
> > +			"$$(TOOLCHAIN_EXTERNAL_CC) $$(TOOLCHAIN_EXTERNAL_CFLAGS)") ; \
> >  	else \
> >  		$$(call check_glibc,$$$${SYSROOT_DIR}) ; \
> >  	fi
> > 
> 
> -- 
> Arnout Vandecappelle                          arnout at mind be
> Senior Embedded Software Architect            +32-16-286500
> Essensium/Mind                                http://www.mind.be
> G.Geenslaan 9, 3001 Leuven, Belgium           BE 872 984 063 RPR Leuven
> LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle
> GPG fingerprint:  7493 020B C7E3 8618 8DEC 222C 82EB F404 F9AC 0DDF

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'



More information about the buildroot mailing list