[Buildroot] [PATCH] toolchain: improve musl check to support static toolchains
Arnout Vandecappelle
arnout at mind.be
Mon Jul 16 22:11:25 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.
>
> 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>
I looked long and hard for a better alternative, but I couldn't find anything.
I also thought of testing whether __GLIBC__ is defined, but that's not very
stable either (any non-musl library that doesn't define __GLIBC__, including
bionic and newlib, would also be detected as musl).
Therefore:
Reviewed-by: Arnout Vandecappelle (Essensium/Mind) <arnout at mind.be>
Regards,
Arnout
> ---
> 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