toolchain: check ARM EABI vs. EABIhf for external toolchains
Following the introduction of the support of EABIhf as a second ARM ABI, it is important to check whether the external toolchain provided by the user actually uses the ABI that has been selected in the Buildroot configuration. This commit introduces such a check by looking at the 'Tag_ABI_VFP_args' tag of the architecture-specific section of the ELF headers. This assumes that ELF is the binary format used on ARM, which may not be the case on ARM noMMU systems (they use the FLAT binary format), but Buildroot doesn't have support for such systems at the moment. Also ensure the correct CFLAGS are passed to the cross compiler for the test, so the correct variant is used in case the toolchain is multilib. [Peter: mention CFLAGS change] Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> Acked-by: "Yann E. MORIN" <yann.morin.1998@free.fr> Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
This commit is contained in:
parent
0bbbcb96db
commit
b2e88073db
@ -279,10 +279,25 @@ check_uclibc = \
|
|||||||
#
|
#
|
||||||
check_arm_abi = \
|
check_arm_abi = \
|
||||||
__CROSS_CC=$(strip $1) ; \
|
__CROSS_CC=$(strip $1) ; \
|
||||||
|
__CROSS_READELF=$(strip $2) ; \
|
||||||
EXT_TOOLCHAIN_TARGET=`LANG=C $${__CROSS_CC} -v 2>&1 | grep ^Target | cut -f2 -d ' '` ; \
|
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 \
|
if ! echo $${EXT_TOOLCHAIN_TARGET} | grep -qE 'eabi(hf)?$$' ; then \
|
||||||
echo "External toolchain uses the unsuported OABI" ; \
|
echo "External toolchain uses the unsuported OABI" ; \
|
||||||
exit 1 ; \
|
exit 1 ; \
|
||||||
|
fi ; \
|
||||||
|
EXT_TOOLCHAIN_CRT1=`LANG=C $${__CROSS_CC} -print-file-name=crt1.o` ; \
|
||||||
|
if $${__CROSS_READELF} -A $${EXT_TOOLCHAIN_CRT1} | grep -q "Tag_ABI_VFP_args:" ; then \
|
||||||
|
EXT_TOOLCHAIN_ABI="eabihf" ; \
|
||||||
|
else \
|
||||||
|
EXT_TOOLCHAIN_ABI="eabi" ; \
|
||||||
|
fi ; \
|
||||||
|
if [ "$(BR2_ARM_EABI)" = "y" -a "$${EXT_TOOLCHAIN_ABI}" = "eabihf" ] ; then \
|
||||||
|
echo "Incorrect ABI setting: EABI selected, but toolchain uses EABIhf" ; \
|
||||||
|
exit 1 ; \
|
||||||
|
fi ; \
|
||||||
|
if [ "$(BR2_ARM_EABIHF)" = "y" -a "$${EXT_TOOLCHAIN_ABI}" = "eabi" ] ; then \
|
||||||
|
echo "Incorrect ABI setting: EABIhf selected, but toolchain uses EABI" ; \
|
||||||
|
exit 1 ; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -125,6 +125,7 @@ endif
|
|||||||
TOOLCHAIN_EXTERNAL_CROSS=$(TOOLCHAIN_EXTERNAL_BIN)/$(TOOLCHAIN_EXTERNAL_PREFIX)-
|
TOOLCHAIN_EXTERNAL_CROSS=$(TOOLCHAIN_EXTERNAL_BIN)/$(TOOLCHAIN_EXTERNAL_PREFIX)-
|
||||||
TOOLCHAIN_EXTERNAL_CC=$(TOOLCHAIN_EXTERNAL_CROSS)gcc
|
TOOLCHAIN_EXTERNAL_CC=$(TOOLCHAIN_EXTERNAL_CROSS)gcc
|
||||||
TOOLCHAIN_EXTERNAL_CXX=$(TOOLCHAIN_EXTERNAL_CROSS)g++
|
TOOLCHAIN_EXTERNAL_CXX=$(TOOLCHAIN_EXTERNAL_CROSS)g++
|
||||||
|
TOOLCHAIN_EXTERNAL_READELF=$(TOOLCHAIN_EXTERNAL_CROSS)readelf
|
||||||
TOOLCHAIN_EXTERNAL_WRAPPER_ARGS = -DBR_SYSROOT='"$(STAGING_SUBDIR)"'
|
TOOLCHAIN_EXTERNAL_WRAPPER_ARGS = -DBR_SYSROOT='"$(STAGING_SUBDIR)"'
|
||||||
|
|
||||||
ifeq ($(filter $(HOST_DIR)/%,$(TOOLCHAIN_EXTERNAL_BIN)),)
|
ifeq ($(filter $(HOST_DIR)/%,$(TOOLCHAIN_EXTERNAL_BIN)),)
|
||||||
@ -368,7 +369,9 @@ $(STAMP_DIR)/ext-toolchain-checked: $(TOOLCHAIN_EXTERNAL_DEPENDENCIES)
|
|||||||
exit 1 ; \
|
exit 1 ; \
|
||||||
fi ; \
|
fi ; \
|
||||||
if test x$(BR2_arm) == x"y" ; then \
|
if test x$(BR2_arm) == x"y" ; then \
|
||||||
$(call check_arm_abi,$(TOOLCHAIN_EXTERNAL_CC)) ; \
|
$(call check_arm_abi,\
|
||||||
|
"$(TOOLCHAIN_EXTERNAL_CC) $(TOOLCHAIN_EXTERNAL_CFLAGS)",\
|
||||||
|
$(TOOLCHAIN_EXTERNAL_READELF)) ; \
|
||||||
fi ; \
|
fi ; \
|
||||||
if test x$(BR2_INSTALL_LIBSTDCPP) == x"y" ; then \
|
if test x$(BR2_INSTALL_LIBSTDCPP) == x"y" ; then \
|
||||||
$(call check_cplusplus,$(TOOLCHAIN_EXTERNAL_CXX)) ; \
|
$(call check_cplusplus,$(TOOLCHAIN_EXTERNAL_CXX)) ; \
|
||||||
|
Loading…
Reference in New Issue
Block a user