All of lore.kernel.org
 help / color / mirror / Atom feed
* [Buildroot] [PATCH] toolchain: improve musl check to support static toolchains
@ 2018-07-04 21:42 Thomas Petazzoni
  2018-07-05  2:54 ` Baruch Siach
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Thomas Petazzoni @ 2018-07-04 21:42 UTC (permalink / raw)
  To: buildroot

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

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [Buildroot] [PATCH] toolchain: improve musl check to support static toolchains
  2018-07-04 21:42 [Buildroot] [PATCH] toolchain: improve musl check to support static toolchains Thomas Petazzoni
@ 2018-07-05  2:54 ` Baruch Siach
  2018-07-05  7:58   ` Thomas Petazzoni
  2018-07-05 22:25 ` Arnout Vandecappelle
  2018-07-16 22:11 ` Arnout Vandecappelle
  2 siblings, 1 reply; 8+ messages in thread
From: Baruch Siach @ 2018-07-05  2:54 UTC (permalink / raw)
  To: buildroot

Hi Thomas,

On Wed, Jul 04, 2018 at 11:42:57PM +0200, 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.

So the check should work even for dynamic only toolchains, right?

> [1] http://autobuild.buildroot.net/toolchains/tarballs/br-arm-musl-static-2018.05.tar.bz2
> 
> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@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

This comment is redundant now.

>  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

baruch

-- 
     http://baruch.siach.name/blog/                  ~. .~   Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
   - baruch at tkos.co.il - tel: +972.52.368.4656, http://www.tkos.co.il -

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Buildroot] [PATCH] toolchain: improve musl check to support static toolchains
  2018-07-05  2:54 ` Baruch Siach
@ 2018-07-05  7:58   ` Thomas Petazzoni
  0 siblings, 0 replies; 8+ messages in thread
From: Thomas Petazzoni @ 2018-07-05  7:58 UTC (permalink / raw)
  To: buildroot

Hello,

On Thu, 5 Jul 2018 05:54:18 +0300, Baruch Siach wrote:

> On Wed, Jul 04, 2018 at 11:42:57PM +0200, 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.  
> 
> So the check should work even for dynamic only toolchains, right?

Yes, it should. I just verified by building a dynamic only musl
toolchain and a dynamic only uclibc toolchain, and then do have libc.a:

MUSL:

$ grep BR2_SHARED_LIBS .config
BR2_SHARED_LIBS=y
$ find host/ -name 'libc.a'
host/arm-buildroot-linux-musleabi/sysroot/lib/libc.a
$ strings host/arm-buildroot-linux-musleabi/sysroot/lib/libc.a | grep MUSL_LOCPATH
MUSL_LOCPATH

UCLIBC:

$ grep BR2_SHARED_LIBS .config
BR2_SHARED_LIBS=y
$ find host/ -name 'libc.a'
host/arm-buildroot-linux-uclibcgnueabi/sysroot/usr/lib/libc.a

Best regards,

Thomas
-- 
Thomas Petazzoni, CTO, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Buildroot] [PATCH] toolchain: improve musl check to support static toolchains
  2018-07-04 21:42 [Buildroot] [PATCH] toolchain: improve musl check to support static toolchains Thomas Petazzoni
  2018-07-05  2:54 ` Baruch Siach
@ 2018-07-05 22:25 ` Arnout Vandecappelle
  2018-07-06  7:36   ` Thomas Petazzoni
  2018-07-07 11:56   ` Yann E. MORIN
  2018-07-16 22:11 ` Arnout Vandecappelle
  2 siblings, 2 replies; 8+ messages in thread
From: Arnout Vandecappelle @ 2018-07-05 22:25 UTC (permalink / raw)
  To: buildroot



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

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Buildroot] [PATCH] toolchain: improve musl check to support static toolchains
  2018-07-05 22:25 ` Arnout Vandecappelle
@ 2018-07-06  7:36   ` Thomas Petazzoni
  2018-07-07 11:56   ` Yann E. MORIN
  1 sibling, 0 replies; 8+ messages in thread
From: Thomas Petazzoni @ 2018-07-06  7:36 UTC (permalink / raw)
  To: buildroot

Hello,

On Fri, 6 Jul 2018 00:25:11 +0200, Arnout Vandecappelle wrote:

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

That's a good idea indeed.

Another thing I noticed is that we don't check the static/shared
capabilities of the toolchain. For example if you try to use a
static-only external toolchain, by you keep the default of
BR2_SHARED_LIBS=y, things don't work very well.

Best regards,

Thomas
-- 
Thomas Petazzoni, CTO, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Buildroot] [PATCH] toolchain: improve musl check to support static toolchains
  2018-07-05 22:25 ` Arnout Vandecappelle
  2018-07-06  7:36   ` Thomas Petazzoni
@ 2018-07-07 11:56   ` Yann E. MORIN
  2018-07-13  7:23     ` Peter Korsgaard
  1 sibling, 1 reply; 8+ messages in thread
From: Yann E. MORIN @ 2018-07-07 11:56 UTC (permalink / raw)
  To: buildroot

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@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.  |
'------------------------------^-------^------------------^--------------------'

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Buildroot] [PATCH] toolchain: improve musl check to support static toolchains
  2018-07-07 11:56   ` Yann E. MORIN
@ 2018-07-13  7:23     ` Peter Korsgaard
  0 siblings, 0 replies; 8+ messages in thread
From: Peter Korsgaard @ 2018-07-13  7:23 UTC (permalink / raw)
  To: buildroot

>>>>> "Yann" == Yann E MORIN <yann.morin.1998@free.fr> writes:

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

*Grumble* It looked so nice and simple :/

-- 
Bye, Peter Korsgaard

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Buildroot] [PATCH] toolchain: improve musl check to support static toolchains
  2018-07-04 21:42 [Buildroot] [PATCH] toolchain: improve musl check to support static toolchains Thomas Petazzoni
  2018-07-05  2:54 ` Baruch Siach
  2018-07-05 22:25 ` Arnout Vandecappelle
@ 2018-07-16 22:11 ` Arnout Vandecappelle
  2 siblings, 0 replies; 8+ messages in thread
From: Arnout Vandecappelle @ 2018-07-16 22:11 UTC (permalink / raw)
  To: buildroot



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

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2018-07-16 22:11 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-07-04 21:42 [Buildroot] [PATCH] toolchain: improve musl check to support static toolchains Thomas Petazzoni
2018-07-05  2:54 ` Baruch Siach
2018-07-05  7:58   ` Thomas Petazzoni
2018-07-05 22:25 ` Arnout Vandecappelle
2018-07-06  7:36   ` Thomas Petazzoni
2018-07-07 11:56   ` Yann E. MORIN
2018-07-13  7:23     ` Peter Korsgaard
2018-07-16 22:11 ` Arnout Vandecappelle

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.