Linux
靜態連結 util-linux - 交叉編譯(生成動態連結文件)
我一直在嘗試為 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是剛剛創建的文件,並且:
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 錯誤?
我剛剛弄清楚為什麼我的問題中發布的原始命令沒有生成靜態文件!我不得不執行make LDFLAGS="–static “。在我這樣做之後,一切都是靜態連結的!
重複一遍,我跑了:
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.