diff options
author | Thomas Petazzoni <thomas.petazzoni@bootlin.com> | 2018-07-04 23:42:57 +0200 |
---|---|---|
committer | Thomas Petazzoni <thomas.petazzoni@bootlin.com> | 2018-08-21 22:11:51 +0200 |
commit | d67cebcda0edb4ed598c0ed800d0425c4ae14c02 (patch) | |
tree | b233ab8467c10d64970c7fe9dc064135b290d51e /toolchain | |
parent | b1db9038ddaf89c4abf69e17993eb13646da7e8d (diff) |
toolchain: improve musl check to support static toolchains
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@bootlin.com>
Reviewed-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Diffstat (limited to 'toolchain')
-rw-r--r-- | toolchain/helpers.mk | 9 | ||||
-rw-r--r-- | 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 |