Linux

靜態連結 util-linux - 交叉編譯(生成動態連結文件)

  • September 24, 2020

我一直在嘗試為 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.

引用自:https://unix.stackexchange.com/questions/320033