静的リンク util-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

ご覧のとおり、私は「理解されていることを確認するため」に、繰り返しも含めて考えられるすべての場所で static を指定しました。configure スクリプトを実行すると、出力は次のようになります。

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" パラメータが欠落していることを除けば、前の configure コマンドとまったく同じです。"--enable-static-programs" パラメータは、デフォルトですべてを静的にコンパイルするはずなのですが、実際にはそうではありません。

何か間違っているのでしょうか、それともこれは Makefile エラーでしょうか?

答え1

質問で投稿した元のコマンドが静的ファイルを生成しない理由が分かりました。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.

答え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を に置き換えてください。クロスコンパイル セットアップがすでに機能していたため、これを使用しました)。gnueabiarmhf

答え3

更新 - 下記の私の他の回答を参照してください

さて、util-linuxのconfigureスクリプトによって作成された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

そこで、すべてのオブジェクト ファイルを 1 行に統合し、別のコマンドを実行しました。

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 が生成されました。

そこで、私はファイル コマンドを実行してその栄誉を称えました:

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 時間を費やしましたが、「すべてに当てはまる 1 つの解決策」はないかもしれませんが、これは確かに役立ちます。Android フォンでファイルをテストしたところ、うまくいきました。

また、このソリューションは、オブジェクト ファイルをリンクして静的にリンクされたファイルを作成するだけなので、「1 つの解決策ですべて解決できる」ように見えます。私はこれを、まったく異なるソース パッケージの別のユーティリティでテストしましたが、これも機能しました。

答え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が、リストに追加しても機能しません (他の人は追加します)。そのリストの外部にある他の静的バージョンを取得する方法はありますか?

関連情報