config-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] PR bootstrap/65176: config.guess failed to guess machine with 64


From: H.J. Lu
Subject: [PATCH] PR bootstrap/65176: config.guess failed to guess machine with 64-bit kernel and 32-bit user space
Date: Mon, 23 Feb 2015 09:17:43 -0800
User-agent: Mutt/1.5.23 (2014-03-12)

32-bit and x32 user-space environments may be running under Linux/x86-64
kernel.  Using "uname -m" isn't sufficient to properly detect the
canonical system name for 32-bit and x32 user-space environments.  This
patch checks if compiler is configured for 64-bit, 32-bit or x32 objects
under Linux/x86-64 kernel.

Tested with 64-bit, 32-bit and x32 user-space environments under
Linux/x86-64 kernel.  I am not sure if this will ever be accepted in
upstream since the config.guess maintainer doesn't want to add a new
use of set_cc_for_build to config.guess.  set_cc_for_build is used for
Linux:

case "${UNAME_SYSTEM}" in
Linux|GNU|GNU/*)
        # If the system lacks a compiler, then just pick glibc.
        # We could probably try harder.
        LIBC=gnu

        eval $set_cc_for_build
        cat <<-EOF > $dummy.c
        #include <features.h>
        #if defined(__UCLIBC__)
        LIBC=uclibc
        #elif defined(__dietlibc__)
        LIBC=dietlibc
        #else
        LIBC=gnu
        #endif
        EOF
        eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, 
,,g'`
        ;;

Adding another use for Linux/x86-64 solves this issue.  I'd like to see
this fixed in gcc, binutils and glibc even if it won't be fixed in
upstream.

Thanks.

H.J.
---
        PR bootstrap/65176
        * config.guess (x86_64:Linux:*:*): Check if compiler is configured
        for 64-bit, 32-bit or x32 objects.
---
 config.guess | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/config.guess b/config.guess
index dbfb978..e5a2d41 100755
--- a/config.guess
+++ b/config.guess
@@ -1021,7 +1021,26 @@ EOF
        echo ${UNAME_MACHINE}-dec-linux-${LIBC}
        exit ;;
     x86_64:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+       eval $set_cc_for_build
+       LINUX_MACHINE="i686"
+       LINUX_LIBC=${LIBC}
+       # If there is a compiler, see if it is configured for 64-bit,
+       # 32-bit or x32 objects.
+       if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+           if (echo '#ifdef __x86_64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+               (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+               grep IS_64BIT_ARCH >/dev/null
+           then
+             LINUX_MACHINE="x86_64"
+             if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \
+                 (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+                  grep IS_X32 >/dev/null
+             then
+               LINUX_LIBC=gnux32
+             fi
+           fi
+       fi
+       echo ${LINUX_MACHINE}-unknown-linux-${LINUX_LIBC}
        exit ;;
     xtensa*:Linux:*:*)
        echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-- 
1.9.3




reply via email to

[Prev in Thread] Current Thread [Next in Thread]