我一直在尝试为arm交叉编译util-linux,但我总是得到动态链接的可执行文件,我不知道为什么会这样。我的目标是静态的。我一直在使用类似步骤的不同工具之前进行交叉编译,并且它一直有效,所以我不知道这次我做错了什么。我使用的是 Ubuntu 16.04。以下是我正在运行的命令:
export CC=arm-linux-gnueabi-gcc
export ac_cs_linux_vers=4
export CFLAGS=-static
export CPPFLAGS=-static
export LDFLAGS=-static
./configure --host=arm-linux LDFLAGS=-static --disable-shared --without-tinfo --without-ncurses --disable-ipv6 --disable-pylibmount --enable-static-programs=fdisk,sfdisk,whereis --prefix=/opt/util-linux/arm --bindir=/opt/util-linux/arm/bin --sbindir=/opt/util-linux/arm/sbin
正如您所看到的,我在我能想到的每个地方都指定了静态,甚至重复了一些东西“只是为了确保它理解我”,并且在运行配置脚本后,以下是输出:
util-linux 2.28.2
prefix: /opt/util-linux/arm
exec prefix: ${prefix}
localstatedir: ${prefix}/var
bindir: /opt/util-linux/arm/bin
sbindir: /opt/util-linux/arm/sbin
libdir: ${exec_prefix}/lib
includedir: ${prefix}/include
usrbin_execdir: ${exec_prefix}/bin
usrsbin_execdir: ${exec_prefix}/sbin
usrlib_execdir: ${exec_prefix}/lib
compiler: arm-linux-gnueabi-gcc
cflags: -static
suid cflags:
ldflags: -static
suid ldflags:
Python: /usr/bin/python
Python version: 2.7
Python libs: ${exec_prefix}/lib/python2.7/site-packages
Bash completions: /usr/share/bash-completion/completions
Systemd support: no
Btrfs support: yes
warnings:
然后我这样做:
make fdisk
或者
make whereis
编译完成后,我会:
file fdisk
磁盘驱动器是刚刚创建的文件并且:
fdisk: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=369363ef8f8173a3a1c2edc178eb77255a2dc415, not stripped
正如您所看到的,它说“动态链接”。我一直在互联网上搜索,但未能找到答案。我也这样做:
./configure --host=arm-linux LDFLAGS=-static --disable-shared --without-tinfo --without-ncurses --disable-ipv6 --disable-pylibmount --prefix=/opt/util-linux/arm --bindir=/opt/util-linux/arm/bin --sbindir=/opt/util-linux/arm/sbin
这与之前的配置命令完全相同,除了缺少“--enable-static-programs”参数,该参数默认“应该”将所有内容编译为静态,但事实并非如此。
我做错了什么还是这是一个 Makefile 错误?
答案1
我刚刚弄清楚为什么我的问题中发布的原始命令没有生成静态文件!我必须跑使 LDFLAGS="--静态”。在我这样做之后,一切都静态链接了!
重复一遍,我跑了:
export CC=arm-linux-gnueabi-gcc
export ac_cs_linux_vers=4
export CFLAGS=-static
export SUID_CFLAGS=-static
export SUID_LDFLAGS=-static
export CPPFLAGS=-static
export LDFLAGS=-static
然后
./configure --host=arm-linux-gnueabi --disable-shared --without-tinfo --without-ncurses --disable-ipv6 --disable-pylibmount --prefix=/opt/util-linux/arm --bindir=/opt/util-linux/arm/bin --sbindir=/opt/util-linux/arm/sbin
进而
make LDFLAGS="--static"
一切都是静态链接的!正如我之前的回答所示,不再需要对象文件收集,但是,这也可以用作替代方案。
另外,为了供您参考,这是我的版本信息,你们中的一些人可能会关心:
$ arm-linux-gnueabi-gcc --version
arm-linux-gnueabi-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.1) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ arm-linux-androideabi-ld --version
GNU gold (GNU Binutils 2.25.90.20151125) 1.11
Copyright (C) 2015 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) a later version.
This program has absolutely no warranty.
答案2
静态二进制文件是使用.static
扩展构建的;构建后,我得到
$ file fdisk.static
fdisk.static: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=b51ec4b17f772b881d2a1eaefd368cfb96d0db12, not stripped
我只得到了这个
./configure --host=arm-linux-gnueabihf --enable-static-programs=fdisk
(您不应该需要任何FLAGS
变量;在您的设置中替换gnueabihf
为,我只是使用它,因为我已经有了一个有效的交叉编译设置)。gnueabi
armhf
答案3
更新 - 请参阅下面我的其他答案
好的,经过几个小时(字面意思)分析由 util-linux 的配置脚本创建的 Makefile 文件和由另一个实用程序创建的另一个 Makefile 文件(最终会生成静态链接文件),我成功检索了传递给的参数ARM-Linux-gnueabi-gcc生成静态链接文件。所以我最终得到了这个:
arm-linux-gnueabi-gcc -ffloat-store -static -DHAVE_CONFIG_H -static -D_U_="__attribute__((unused))" -o <name_of_your_file> <object files produced by the compiler separated by space>
所以编译后哪里:
make whereis
然后我搜索了生成的所有目标文件:
find . -name "*.o"
我最终得到:
./misc-utils/whereis.o
./lib/libcommon_la-blkdev.o
./lib/libcommon_la-sysfs.o
./lib/libcommon_la-idcache.o
./lib/libcommon_la-procutils.o
./lib/libcommon_la-mbsalign.o
./lib/libcommon_la-linux_version.o
./lib/libcommon_la-env.o
./lib/libcommon_la-pager.o
./lib/libcommon_la-strutils.o
./lib/libcommon_la-mangle.o
./lib/libcommon_la-timeutils.o
./lib/libcommon_la-fileutils.o
./lib/libcommon_la-exec_shell.o
./lib/libcommon_la-match.o
./lib/libcommon_la-crc32.o
./lib/libcommon_la-md5.o
./lib/libcommon_la-randutils.o
./lib/libcommon_la-ttyutils.o
./lib/libcommon_la-cpuset.o
./lib/libcommon_la-color-names.o
./lib/libcommon_la-ismounted.o
./lib/libcommon_la-path.o
./lib/libcommon_la-canonicalize.o
./lib/libcommon_la-loopdev.o
./lib/libcommon_la-setproctitle.o
./lib/libcommon_la-strv.o
然后我将所有这些对象文件合并到一行中,然后运行另一个命令:
arm-linux-gnueabi-gcc -ffloat-store -static -DHAVE_CONFIG_H -static -D_U_="__attribute__((unused))" -o mywhereis ./misc-utils/whereis.o ./lib/libcommon_la-blkdev.o ./lib/libcommon_la-sysfs.o ./lib/libcommon_la-idcache.o ./lib/libcommon_la-procutils.o ./lib/libcommon_la-mbsalign.o ./lib/libcommon_la-linux_version.o ./lib/libcommon_la-env.o ./lib/libcommon_la-pager.o ./lib/libcommon_la-strutils.o ./lib/libcommon_la-mangle.o ./lib/libcommon_la-timeutils.o ./lib/libcommon_la-fileutils.o ./lib/libcommon_la-exec_shell.o ./lib/libcommon_la-match.o ./lib/libcommon_la-crc32.o ./lib/libcommon_la-md5.o ./lib/libcommon_la-randutils.o ./lib/libcommon_la-ttyutils.o ./lib/libcommon_la-cpuset.o ./lib/libcommon_la-color-names.o ./lib/libcommon_la-ismounted.o ./lib/libcommon_la-path.o ./lib/libcommon_la-canonicalize.o ./lib/libcommon_la-loopdev.o ./lib/libcommon_la-setproctitle.o ./lib/libcommon_la-strv.o
瞧! :) mywhereis 已生成。
因此,我通过运行 file 命令来获得荣誉:
mywhereis: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=a5b7c4ad147dc26ed211a7aa643f744a29e477f3, not stripped
多么轻松啊!!好吧,这个解决方案并不理想但它完成了工作并且可以简化!
我总共花了大约 8 个小时来研究这个问题并进行实验,我意识到可能没有“一劳永逸的方法”,但这确实可以完成工作!我在我的 Android 手机上测试了该文件,它有效!
此外,该解决方案似乎是“一劳永逸”,因为它只是链接目标文件以创建静态链接文件。我使用完全不同的源包中的另一个实用程序对此进行了测试,并且也有效。
答案4
我花了几个小时试图让整套程序静态链接,结果只有少数可以通过这种方式生成:
从configure.h
:
--enable-static-programs=LIST
link static the programs in LIST (comma-separated,
supported for losetup, mount, umount, fdisk, sfdisk,
blkid, nsenter, unshare)
我需要lsblk
静态链接,即使我将其添加到列表中也不起作用(其他人这样做)。有没有办法获得该列表之外的其他静态版本?