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

Arnout Vandecappelle arnout at mind.be
Thu Jul 5 22:25:11 UTC 2018



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...

 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



More information about the buildroot mailing list