[Buildroot] [PATCH] toolchain: check ARM EABI vs. EABIhf for external toolchains

Thomas Petazzoni thomas.petazzoni at free-electrons.com
Wed Jul 17 07:25:19 UTC 2013


Dear Yann E. MORIN,

On Wed, 17 Jul 2013 00:39:53 +0200, Yann E. MORIN wrote:

> >  	EXT_TOOLCHAIN_TARGET=`LANG=C $${__CROSS_CC} -v 2>&1 | grep ^Target | cut -f2 -d ' '` ; \
> > -	if ! echo $${EXT_TOOLCHAIN_TARGET} | grep -qE 'eabi(hf)?$$' ; then \
> > -		echo "External toolchain uses the unsuported OABI" ; \
> > +	if echo $${EXT_TOOLCHAIN_TARGET} | grep -qE 'eabi$$' ; then \
> > +		EXT_TOOLCHAIN_ABI="eabi" ; \
> > +	elif echo $${EXT_TOOLCHAIN_TARGET} | grep -qE 'eabihf$$' ; then \
> > +		EXT_TOOLCHAIN_ABI="eabihf" ; \
> 
> That's not always the case. You can well have a toolchain which tuple
> ends in eabi, but the toolchain uses the hard-float ABI.
> 
> That's the case by default for crosstool-NG toolchains, for example.
> Since the *eabihf is recent, not all gcc or binutils versions recognise
> it, while they are absolutely capable of emitting EABI using the
> hard-float ABI. Hence, ct-ng allows adding the 'hf' suffix as an option.
> (see attachment for an example of 'gcc -v' dump).
> 
> Checking for EABI, it is better and more reliable to run the
> preprocessor, and check some defines are available or not (I always
> need a bit of googling to get this):
>     ARM_TUPLE-gcc -E -dM -xc - </dev/null |grep __ARM_EABI__
> 
> However, I could not find a #define about the float ABI... :-(

Ah, interesting. Originally, I wasn't planning on checking the tuple,
and I was instead thinking of using a specific tag in the ELF headers.

A binary compiled with an EABIhf toolchain:

$ arm-linux-gnueabihf-readelf -A toto.o | grep Tag_ABI_VFP_args
  Tag_ABI_VFP_args: VFP registers
$

A binary compiled with an EABI toolchain:

$ arm-linux-gnueabihf-readelf -A toto.o | grep Tag_ABI_VFP_args
$

I would run this on the libc or ld.so provided with the toolchain.

What do you think?

> > +	else \
> > +		echo "Unsupported ABI of the external toolchain" ; \
> > +		exit 1 ; \
> > +	fi ; \
> > +	if [ x$(BR2_ARM_EABI) = x"y" -a $${EXT_TOOLCHAIN_ABI} = "eabihf" ] ; then \
> 
> Using this 'x$(VAR) = xy' construct is ugly. Just quote the variables,
> it is easier to read:
>     if [ "$(BR2_ARM_EABI)" = "y" ... ]
> 
> The x$VAR construct was from a time when some shells where failing to
> test against an empty string. That time is long gone. Virtaully all
> shells can compare to empty strings, nowadays.

Ok, will fix.

Thomas
-- 
Thomas Petazzoni, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com



More information about the buildroot mailing list