The current code is duplicated in two places and relies on `uname` to
detect the flags. This is no good for cross-compiling, and the current
logic uses -m64 for the x32 ABI which breaks things.
Unify the code in one place, avoid `uname` completely, and add support
for the new x32 ABI.
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
+ # Check if objects are 32-bit and we're running in 64-bit
+ # environment. If so, pass -m32 flag to linker.
+ add_abi_flag_to_opts() {
+ case $(file $1) in
+ *32-bit*x86-64*)
+ # x86_64 x32 ABI.
+ OPTS="-mx32 ${OPTS}"
+ ;;
+ *64-bit*x86-64*)
+ # x86_64 64-bit ABI.
+ OPTS="-m64 ${OPTS}"
+ ;;
+ *32-bit*Intel*)
+ # x86 32-bit ABI.
+ OPTS="-m32 ${OPTS}"
+ ;;
+ esac
+ }
+
if [ $NOPREFIX = 1 ] ; then
# No "lib" or ".so" part
echo "mklib: Making" $ARCH "shared library: " ${LIBNAME}
if [ $NOPREFIX = 1 ] ; then
# No "lib" or ".so" part
echo "mklib: Making" $ARCH "shared library: " ${LIBNAME}
- # Check if objects are 32-bit and we're running in 64-bit
- # environment. If so, pass -m32 flag to linker.
- set ${OBJECTS}
- ABI32=`file $1 | grep 32-bit`
- ARM=`file $1 | grep ARM`
- # Do not add "-m32" option for arm.
- if [ -z "$ARM" -a "${ABI32}" -a `uname -m` = "x86_64" ] ; then
- OPTS="-m32 ${OPTS}"
- fi
+ # Check to see if we are building for a different ABI.
+ add_abi_flag_to_opts ${OBJECTS}
if [ "${ALTOPTS}" ] ; then
OPTS=${ALTOPTS}
if [ "${ALTOPTS}" ] ; then
OPTS=${ALTOPTS}
# exptmp is removed below
fi
# exptmp is removed below
fi
- # Check if objects are 32-bit and we're running in 64-bit
- # environment. If so, pass -m32 flag to linker.
- set ${OBJECTS}
- ABI32=`file $1 | grep 32-bit`
- ARM=`file $1 | grep ARM`
- # Do not add "-m32" option for arm.
- if [ -z "$ARM" -a "${ABI32}" -a `uname -m` = "x86_64" ] ; then
- OPTS="-m32 ${OPTS}"
- fi
+ # Check to see if we are building for a different ABI.
+ add_abi_flag_to_opts ${OBJECTS}
+
if [ "${ALTOPTS}" ] ; then
OPTS=${ALTOPTS}
fi
if [ "${ALTOPTS}" ] ; then
OPTS=${ALTOPTS}
fi