Received: (at submit) by debbugs.gnu.org; 15 Jul 2017 22:49:41 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Jul 15 18:49:41 2017 Received: from localhost ([127.0.0.1]:40784 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1dWVsV-0004D0-UV for submit <at> debbugs.gnu.org; Sat, 15 Jul 2017 18:49:40 -0400 Received: from eggs.gnu.org ([208.118.235.92]:45153) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <bruno@HIDDEN>) id 1dWVsT-0004Co-K1 for submit <at> debbugs.gnu.org; Sat, 15 Jul 2017 18:49:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from <bruno@HIDDEN>) id 1dWVsN-0007yH-1u for submit <at> debbugs.gnu.org; Sat, 15 Jul 2017 18:49:28 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,T_DKIM_INVALID autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:43966) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from <bruno@HIDDEN>) id 1dWVsM-0007xv-Ta for submit <at> debbugs.gnu.org; Sat, 15 Jul 2017 18:49:26 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36114) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from <bruno@HIDDEN>) id 1dWVsJ-0001x9-OG for bug-libtool@HIDDEN; Sat, 15 Jul 2017 18:49:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from <bruno@HIDDEN>) id 1dWVsG-0007lz-EB for bug-libtool@HIDDEN; Sat, 15 Jul 2017 18:49:23 -0400 Received: from mo6-p00-ob.smtp.rzone.de ([2a01:238:20a:202:5300::12]:32494) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from <bruno@HIDDEN>) id 1dWVsG-0007in-0m for bug-libtool@HIDDEN; Sat, 15 Jul 2017 18:49:20 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1500158958; l=7974; s=domk; d=clisp.org; h=Content-Transfer-Encoding:Content-Type:MIME-Version:Date:Subject:To: From; bh=5ejdzU+GSmORKFeMDJoaB8NE877yiG+Tya+dmGA57+8=; b=AAPwWnQwb0LO4uuAvyu7H4+K967g80AGl5d5X2jXGD/XfMlCUjahbElVNGSubiGpiw b4pjT2qgXoSK9SnNZXCJHsdKZo9BJDry1eAxieI/vavBEka9MbZ3heHQCCQ2ClbzKI0U 4AmQx5i8X3vhCSs8Db/xa6E16s2SMckhbPA/o= X-RZG-AUTH: :Ln4Re0+Ic/6oZXR1YgKryK8brksyK8dozXDwHXjf9hj/zDNRavM45bp2 X-RZG-CLASS-ID: mo00 Received: from bruno.haible.de (dslb-088-068-035-076.088.068.pools.vodafone-ip.de [88.68.35.76]) by smtp.strato.de (RZmta 41.1 DYNA|AUTH) with ESMTPSA id x01200t6FMgxplN (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (curve secp521r1 with 521 ECDH bits, eq. 15360 bits RSA)) (Client did not present a certificate); Sun, 16 Jul 2017 00:42:59 +0200 (CEST) From: Bruno Haible <bruno@HIDDEN> To: bug-libtool@HIDDEN Subject: libtool makes it impossible to build a package statically Date: Sun, 16 Jul 2017 00:42:58 +0200 Message-ID: <3009480.1b2adHvoDB@omega> User-Agent: KMail/5.1.3 (Linux/4.4.0-83-generic; KDE/5.18.0; x86_64; ; ) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="nextPart4252892.gXJH3gUTyE" Content-Transfer-Encoding: 7Bit X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -5.0 (-----) This is a multi-part message in MIME format. --nextPart4252892.gXJH3gUTyE Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Hi, Summary ------- The processing of the '-static' option by "libtool --mode=link" makes it impossible to build a package in such a way that 1) all libraries are static, 2) all binaries are statically linked (ldd reports "not a dynamic executable"). Motivation ---------- There are many use-cases of statically linked binaries. In my case it's because I want to run programs under qemu in "user mode", and for big-endian CPUs currently only statically linked binaries work. [1] Details ------- In packages that don't create shared libraries and therefore don't use libtool, the way to achieve statically linked binaries (assuming GCC) is simple: $ ./configure LDFLAGS="-static" For packages that create *only* shared libraries, the GNU libtool manual provides a solution [2][3]: $ ./configure --enable-static --disable-shared LDFLAGS="-all-static" But this is not a general solution: Some packages, like GNU libffcall, create shared libraries AND static libraries. But there is only 1 LDFLAGS parameter that can be passed to 'configure'. 'configure' (thankfully!) does not take 2 different variables LDFLAGS (for non-libtool linking) and LTLDFLAGS (for libtool linking), because the use of libtool is an internal detail of a package, and the user who wants to install it should not see added complexity because of libtool. So, 1) $ ./configure --enable-static --disable-shared LDFLAGS="-static" does not work for producing statically linked binaries because libtool intercepts the 'static' option. The result (according to 'ldd') is a binary that is linked against the *shared* libc. 2) $ ./configure --enable-static --disable-shared LDFLAGS="-all-static" does not work because GCC does not understand a '-all-static' option. 3) The hint given in [4] $ ./configure --enable-static --disable-shared LDFLAGS="-Xcompiler -static" does not work because GCC does not understand a '-Xcompiler' option. How to reproduce ---------------- $ wget https://haible.de/bruno/gnu/libiconv-20170715.tar.gz 1) $ tar xvfz libiconv-20170715.tar.gz $ cd libiconv-20170715 $ ./configure --enable-static --disable-shared LDFLAGS="-static" $ make $ make install DESTDIR=/tmp/inst $ LC_ALL=C ldd /tmp/inst/usr/local/bin/iconv linux-vdso.so.1 => (0x00007fff1a74d000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fddde90b000) /lib64/ld-linux-x86-64.so.2 (0x00005580e2f6c000) 2) $ tar xvfz libiconv-20170715.tar.gz $ cd libiconv-20170715 $ ./configure --enable-static --disable-shared LDFLAGS="-all-static" ... checking whether the C compiler works... no configure: error: in `/tmp/libiconv-20170715': configure: error: C compiler cannot create executables See `config.log' for more details 3) $ tar xvfz libiconv-20170715.tar.gz $ cd libiconv-20170715 $ ./configure --enable-static --disable-shared LDFLAGS="-Xcompiler -static" ... checking whether the C compiler works... no configure: error: in `/tmp/libiconv-20170715': configure: error: C compiler cannot create executables See `config.log' for more details Past reports ------------ In 2004, this was discussed here: [5] already gave the solution, namely to rename libtool's options. [6] gives the rationale. For the specific case of GNU binutils, it was reported in 2011: [7][8] Reported again in 2012: [9][10] My workaround ------------- I work around it with the solution from [5]. Instead of '-lt-static' I chose '-static-uninstalled-libs', in order to reduce the confusion with the existing option '-static-libtool-libs'. Patch attached. It touches only the *link* mode of libtool. I don't see a reason for touching the *compile* mode of libtool, since the right place for the '-static' option is LDFLAGS, not CFLAGS. [11] With this patch, it works as expected: $ tar xvfz libiconv-20170715.tar.gz $ cd libiconv-20170715 $ patch -p1 < /tmp/libtool-allow-static.diff $ ./configure --enable-static --disable-shared LDFLAGS="-static" $ make $ make install DESTDIR=/tmp/inst $ LC_ALL=C ldd /tmp/inst/usr/local/bin/iconv not a dynamic executable Best regards, Bruno [1] https://bugs.launchpad.net/qemu/+bug/1701798 [2] https://www.gnu.org/software/libtool/manual/html_node/LT_005fINIT.html [3] https://www.sourceware.org/autobook/autobook/autobook_59.html#Linking-against-Libtool-Libraries-with-Automake [4] https://debbugs.gnu.org/cgi/bugreport.cgi?bug=11064 [5] https://lists.gnu.org/archive/html/libtool/2004-11/msg00017.html [6] https://lists.gnu.org/archive/html/libtool/2004-11/msg00024.html [7] https://sourceware.org/ml/binutils/2011-08/msg00159.html [8] https://sourceware.org/bugzilla/show_bug.cgi?id=13891 [9] https://debbugs.gnu.org/cgi/bugreport.cgi?bug=11064 [10] https://lists.gnu.org/archive/html/bug-libtool/2012-03/msg00011.html [11] https://www.gnu.org/software/autoconf/manual/autoconf-2.69/html_node/Preset-Output-Variables.html --nextPart4252892.gXJH3gUTyE Content-Disposition: attachment; filename="libtool-allow-static.diff" Content-Transfer-Encoding: 7Bit Content-Type: text/x-patch; charset="UTF-8"; name="libtool-allow-static.diff" diff --git a/build-aux/ltmain.sh b/build-aux/ltmain.sh index 0f0a2da..1d0185a 100644 --- a/build-aux/ltmain.sh +++ b/build-aux/ltmain.sh @@ -3720,6 +3720,7 @@ a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all + -static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) @@ -3746,7 +3747,8 @@ The following components of LINK-COMMAND are treated specially: -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension - -static do not do any dynamic linking of uninstalled libtool libraries + -static-uninstalled-libs + do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] @@ -6573,9 +6575,9 @@ func_mode_link () build_old_libs=no break ;; - -all-static | -static | -static-libtool-libs) + -all-static | -static | -static-uninstalled-libs | -static-libtool-libs) case $arg in - -all-static) + -all-static | -static) if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi @@ -6584,7 +6586,7 @@ func_mode_link () fi prefer_static_libs=yes ;; - -static) + -static-uninstalled-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi @@ -6883,7 +6885,7 @@ func_mode_link () prevarg=$arg case $arg in - -all-static) + -all-static | -static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" @@ -7174,9 +7176,9 @@ func_mode_link () continue ;; - -static | -static-libtool-libs) - # The effects of -static are defined in a previous loop. - # We used to do the same as -all-static on platforms that + -static-uninstalled-libs | -static-libtool-libs) + # The effects of -static-uninstalled-libs are defined in a previous + # loop. We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. --nextPart4252892.gXJH3gUTyE--
Bruno Haible <bruno@HIDDEN>
:bug-libtool@HIDDEN
.
Full text available.bug-libtool@HIDDEN
:bug#27722
; Package libtool
.
Full text available.
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997 nCipher Corporation Ltd,
1994-97 Ian Jackson.