From patchwork Tue Feb 4 08:35:05 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ray Donnelly X-Patchwork-Id: 316479 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 04FA92C007C for ; Tue, 4 Feb 2014 19:35:17 +1100 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:mime-version:date:message-id:subject:from:to :content-type; q=dns; s=default; b=Tpu4VSiKRQuT6wnJ0atqX+FlCCDZh HdCiWAkucKmYgbycsdKUhbgTZkwlWOBrPPe+bAu+oNZtszt5lUar3BfrPghxpeyC 9YTGFP5hypLFq9Jv5M2Avan7ZVZ0Q2hjnU06EmW4jT+zjkUR+GKdt1rc4YE3pDYn WmHlOfXkflVAqs= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:mime-version:date:message-id:subject:from:to :content-type; s=default; bh=WC5QfMwj03FUoJlsQ0RGIuMrlgM=; b=W9G Z8oB2CDgXnAO9Sal3uwy+RpIwCP0f/aSO2lH6C/+BOUUS5zcP4WLuA0Kek2KRtZQ hCKHUxkAuT47jv5zAGz7uFBqVN72iQeIUUlr4kYXOzbxfoBQOpiMDEcUNvaAN4LJ KHk92U8YHbQKNbDq7FTp8LW8QJwoS9vuXPQNUNmc= Received: (qmail 18280 invoked by alias); 4 Feb 2014 08:35:10 -0000 Mailing-List: contact crossgcc-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: crossgcc-owner@sourceware.org Delivered-To: mailing list crossgcc@sourceware.org Received: (qmail 18259 invoked by uid 89); 4 Feb 2014 08:35:09 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-we0-f170.google.com Received: from mail-we0-f170.google.com (HELO mail-we0-f170.google.com) (74.125.82.170) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Tue, 04 Feb 2014 08:35:08 +0000 Received: by mail-we0-f170.google.com with SMTP id w62so3786959wes.29 for ; Tue, 04 Feb 2014 00:35:05 -0800 (PST) MIME-Version: 1.0 X-Received: by 10.180.92.169 with SMTP id cn9mr11384650wib.35.1391502905195; Tue, 04 Feb 2014 00:35:05 -0800 (PST) Received: by 10.227.206.2 with HTTP; Tue, 4 Feb 2014 00:35:05 -0800 (PST) Date: Tue, 4 Feb 2014 08:35:05 +0000 Message-ID: Subject: [PATCH 3/3] {e}glibc: Fix various multilib build bugs From: Ray Donnelly To: "crossgcc@sourceware.org" X-IsSubscribed: yes # HG changeset patch # User Ray Donnelly # Date 1391501320 0 # Tue Feb 04 08:08:40 2014 +0000 # Node ID 8f8b94c987feadc63f23ca72b6de87d404c7cca7 # Parent 45760158aca33981b5bb882191043bd708b57dbb {e}glibc: Fix various multilib build bugs --host=${CT_TARGET} with eg -m32 is not right. The arch part must be correct (i686 for 32-bit and x86_64 for 64-bit). Un-fortunately GCC has no mechanism for returning each arches triplet so instead some hacks are used. Debian can ask "gcc -m32 -print-multiarch" but this flag isnt provided on other GCC builds. The old symlinks from lib32/64 to lib are only made if CT_MULTILIB=n, and the comment that we are not multilib on the target side corrected. The stub libc.so is compiled with extra_cflags so that it is for the correct multilib arch. The stub libc.so and crt*.o files are moved to the multilib os directory and not the multilib directory if gcc arg -print-multi-os-directory is supported. --libdir=<> is passed to libc's configure such that it is made inplace in the multilib-os dir and 'Fixing up multilib location' is no longer required. The multilib directories are sorted in reverse order so that x86_64 is built finally. This is because x86_64 headers are multilib-capable as far back as glibc-2.15 (at least) whereas i686 headers were not multilib-capable until 2.16. Signed-off-by: Ray Donnelly - # Remove the multi_dir now it is no longer useful - CT_DoExecLog DEBUG rm -rf "${CT_SYSROOT_DIR}/${multi_dir}" - fi # libc_mode == final - - CT_EndStep - fi done CT_EndStep @@ -180,6 +181,7 @@ # Parameter : Definition : Type : Default # libc_headers : Build libc headers : bool : n # libc_startfiles : Build libc start-files : bool : n +# libc_triplet : Build libc triplet : string : ${CT_TARGET} # libc_full : Build full libc : bool : n # extra_flags : Extra CFLAGS to use (for multilib) : string : (empty) # extra_dir : Extra subdir for multilib : string : (empty) @@ -189,6 +191,9 @@ local libc_full local extra_flags local extra_dir + local extraos_dir + local lib_dir + local install_root local src_dir="${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}" local extra_cc_args local -a extra_config @@ -196,6 +201,7 @@ local glibc_cflags local float_extra local endian_extra + local libc_triplet="${CT_TARGET}" local arg for arg in "$@"; do @@ -328,6 +334,29 @@ # or even after they get installed... echo "ac_cv_path_BASH_SHELL=/bin/bash" >>config.cache + # GCC makes the distinction between multilib directories + # (gotten via -print-multilib or -print-multi-directory) + # and multilib-os directories (via -print-multi-os-directory) + # They are also often horribly mis-aligned, such as: + # multilib: -m32=32 -m64=. + # multilib-os: -m32=../lib -m64=../lib64 + # it is important that multilib sub-folders of the sysroot use + # the multilib-os directory and *not* the multilib directory. + # The multilib directory is a GCC implementation detail rather + # than something that users need to be concerned about. Older + # GCCs do not understand -print-multi-os-directory so we fall + # back on some simple transformations (that are wrong in the + # above example!) + if "${cross_cc}" -print-multi-os-directory ${extra_cc_args} > /dev/null 2>&1; then + lib_dir=/usr/lib/$("${cross_cc}" -print-multi-os-directory ${extra_cc_args}) + install_root="${CT_SYSROOT_DIR}" + else + # maintain the previous behaviour if -print-multi-os-directory doesn't work. + lib_dir=/usr/lib + install_root="${CT_SYSROOT_DIR}${extra_dir}" + fi + extraos_dir="${install_root}${lib_dir}" + # Configure with --prefix the way we want it on the target... # There are a whole lot of settings here. You'll probably want # to read up on what they all mean, and customize a bit, possibly by setting GLIBC_EXTRA_CONFIG_ARRAY @@ -338,11 +367,14 @@ # Run explicitly through CONFIG_SHELL, or the build breaks badly (loop-of-death) # when the shell is not bash... Sigh... :-( - CT_DoLog DEBUG "Using gcc for target : '${cross_cc}'" - CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'" - CT_DoLog DEBUG "Extra config args passed: '${extra_config[*]}'" - CT_DoLog DEBUG "Extra CC args passed : '${glibc_cflags}'" - CT_DoLog DEBUG "Extra flags (multilib) : '${extra_flags}'" + CT_DoLog DEBUG "Using gcc for target : '${cross_cc}'" + CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'" + CT_DoLog DEBUG "Extra config args passed : '${extra_config[*]}'" + CT_DoLog DEBUG "Extra CC args passed : '${glibc_cflags}'" + CT_DoLog DEBUG "Extra flags (multilib) : '${extra_flags}'" + CT_DoLog DEBUG "Multilib os dir : '${extraos_dir}'" + CT_DoLog DEBUG "Configuring with --host : '${libc_triplet}'" + CT_DoLog DEBUG "Configuring with --libdir: '${lib_dir}'" CT_DoExecLog CFG \ BUILD_CC="${CT_BUILD}-gcc" \ @@ -354,12 +386,13 @@ "${src_dir}/configure" \ --prefix=/usr \ --build=${CT_BUILD} \ - --host=${CT_TARGET} \ + --host=${libc_triplet} \ --cache-file="$(pwd)/config.cache" \ --without-cvs \ --disable-profile \ --without-gd \ --with-headers="${CT_HEADERS_DIR}" \ + --libdir=${lib_dir} \ "${extra_config[@]}" \ "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[@]}" @@ -378,7 +411,7 @@ # use the 'install-headers' makefile target to install the # headers CT_DoExecLog ALL make ${JOBSFLAGS} \ - install_root=${CT_SYSROOT_DIR}${extra_dir} \ + install_root="${install_root}" \ install-bootstrap-headers=yes \ "${extra_make_args[@]}" \ install-headers @@ -427,22 +460,23 @@ # there are a few object files needed to link shared libraries, # which we build and install by hand - CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}${extra_dir}/usr/lib" + CT_DoExecLog ALL mkdir -p "${extraos_dir}" CT_DoExecLog ALL make ${JOBSFLAGS} \ "${extra_make_args[@]}" \ csu/subdir_lib CT_DoExecLog ALL cp csu/crt1.o csu/crti.o csu/crtn.o \ - "${CT_SYSROOT_DIR}${extra_dir}/usr/lib" + "${extraos_dir}" # Finally, 'libgcc_s.so' requires a 'libc.so' to link against. # However, since we will never actually execute its code, # it doesn't matter what it contains. So, treating '/dev/null' # as a C source file, we produce a dummy 'libc.so' in one step - CT_DoExecLog ALL "${cross_cc}" -nostdlib \ + CT_DoExecLog ALL "${cross_cc}" ${extra_flags} \ + -nostdlib \ -nostartfiles \ -shared \ -x c /dev/null \ - -o "${CT_SYSROOT_DIR}${extra_dir}/usr/lib/libc.so" + -o "${extraos_dir}/libc.so" fi # threads == nptl fi # libc_headers == y @@ -453,9 +487,9 @@ all CT_DoLog EXTRA "Installing C library" - CT_DoExecLog ALL make ${JOBSFLAGS} \ - "${extra_make_args[@]}" \ - install_root="${CT_SYSROOT_DIR}${extra_dir}" \ + CT_DoExecLog ALL make ${JOBSFLAGS} \ + "${extra_make_args[@]}" \ + install_root="${install_root}" \ install if [ "${CT_BUILD_MANUALS}" = "y" ]; then --- For unsubscribe information see http://sourceware.org/lists.html#faq diff -r 45760158aca3 -r 8f8b94c987fe scripts/build/cc/gcc.sh --- a/scripts/build/cc/gcc.sh Tue Feb 04 07:55:11 2014 +0000 +++ b/scripts/build/cc/gcc.sh Tue Feb 04 08:08:40 2014 +0000 @@ -375,6 +375,7 @@ if [ "${CT_MULTILIB}" = "y" ]; then extra_config+=("--enable-multilib") + extra_config+=("--enable-targets=all") else extra_config+=("--disable-multilib") fi diff -r 45760158aca3 -r 8f8b94c987fe scripts/build/libc/glibc-eglibc.sh-common --- a/scripts/build/libc/glibc-eglibc.sh-common Tue Feb 04 07:55:11 2014 +0000 +++ b/scripts/build/libc/glibc-eglibc.sh-common Tue Feb 04 08:08:40 2014 +0000 @@ -76,6 +76,9 @@ local multilib local multi_dir local multi_flags + local multi_arch + local native_arch + local rest_of_triplet local extra_dir local libc_headers libc_startfiles libc_full local hdr @@ -85,6 +88,9 @@ eval "${arg// /\\ }" done + native_arch=$(echo "${CT_TARGET}" | ${sed} "s,\(^[^\-]*\).*,\1,g") + rest_of_triplet=$(echo "${CT_TARGET}" | ${sed} "s,^[^\-]*\(.*\),\1,g") + case "${libc_mode}" in startfiles) CT_DoStep INFO "Installing C library headers & start files" @@ -103,8 +109,16 @@ # If gcc is not configured for multilib, it still prints # a single line for the default settings - multilibs=( $("${CT_TARGET}-gcc" -print-multi-lib 2>/dev/null) ) + # sort -r is a hack so that x86_64 gets built last because + # pre-2.16 only the x86_64 headers were applicable to both + # i686 and x86_64. + # The headers were unified (x86-64 won!) between 2.15 and + # 2.16 (BZ14117). This hack makes too many of assumptions + # and needs to be replaced with more robust logic. We need + # to force x86_64 arch to be last element in the array. + multilibs=( $("${CT_TARGET}-gcc" -print-multi-lib 2>/dev/null | sort -r) ) for multilib in "${multilibs[@]}"; do + multi_arch="${native_arch}" multi_dir="${multilib%%;*}" if [ "${multi_dir}" != "." ]; then CT_DoStep INFO "Building for multilib subdir='${multi_dir}'" @@ -114,6 +128,14 @@ )" extra_dir="/${multi_dir}" + # If more substitutions are needed then they + # should be added here, AArch64 for example? + if [ "${extra_flags}" = " -m32" ]; then + multi_arch=${native_arch/x86_64/i686} + elif [ "${extra_flags}" = " -m64" ]; then + multi_arch=${native_arch/i686/x86_64} + fi + # glibc install its files in ${extra_dir}/{usr/,}lib # while gcc expects them in {,usr/}lib/${extra_dir}. # Prepare some symlinks so glibc installs in fact in @@ -140,36 +162,15 @@ CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc-${libc_mode}${extra_dir//\//_}" - do_libc_backend_once extra_dir="${extra_dir}" \ - extra_flags="${extra_flags}" \ - libc_headers="${libc_headers}" \ - libc_startfiles="${libc_startfiles}" \ + do_libc_backend_once extra_dir="${extra_dir}" \ + extra_flags="${extra_flags}" \ + libc_headers="${libc_headers}" \ + libc_startfiles="${libc_startfiles}" \ + libc_triplet="${multi_arch}${rest_of_triplet}" \ libc_full="${libc_full}" CT_Popd - if [ "${multi_dir}" != "." ]; then - if [ "${libc_mode}" = "final" ]; then - CT_DoLog EXTRA "Fixing up multilib location" - - # rewrite the library multiplexers - for d in "lib/${multi_dir}" "usr/lib/${multi_dir}"; do - for l in libc libpthread libgcc_s; do - if [ -f "${CT_SYSROOT_DIR}/${d}/${l}.so" \ - -a ! -L ${CT_SYSROOT_DIR}/${d}/${l}.so ] - then - CT_DoExecLog DEBUG ${sed} -r -i \ - -e "s:/lib/:/lib/${multi_dir}/:g;" \ - "${CT_SYSROOT_DIR}/${d}/${l}.so" - fi - done - done