From patchwork Mon Feb 23 17:17:43 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Lu, Hongjiu" X-Patchwork-Id: 5245 Received: (qmail 21598 invoked by alias); 23 Feb 2015 17:17:55 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 21521 invoked by uid 89); 23 Feb 2015 17:17:54 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.9 required=5.0 tests=AWL, BAYES_00, NO_DNS_FOR_FROM, T_RP_MATCHES_RCVD autolearn=no version=3.3.2 X-Spam-User: qpsmtpd, 2 recipients X-HELO: mga11.intel.com X-ExtLoop1: 1 Date: Mon, 23 Feb 2015 09:17:43 -0800 From: "H.J. Lu" To: gcc-patches@gcc.gnu.org, GNU C Library Cc: binutils@sourceware.org, config-patches@gnu.org Subject: [PATCH] PR bootstrap/65176: config.guess failed to guess machine with 64-bit kernel and 32-bit user space Message-ID: <20150223171743.GA32755@intel.com> Reply-To: "H.J. Lu" MIME-Version: 1.0 Content-Disposition: inline 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 #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}