iperf3のバージョン:
3.2
ハードウェア:
x86_64
オペレーティングシステム(および存在する場合はディストリビューション):
UbuntuでのARMのクロスコンパイル
予想される行動
静的にリンクされた実行可能ファイルをビルドします
実際の動作
動的にリンクされたライブラリを使用して実行可能ファイルを構築します
doru @ doru-N551JK :〜/ Desktop / iperf $ファイル出力/ bin / iperf3
output / bin / iperf3:ELF 32ビットLSB実行可能ファイル、ARM、EABI5バージョン1(SYSV)、動的リンク(共有ライブラリを使用)、GNU / Linux 2.6.32、BuildID [sha1] = 6d84258ed9cbe40710234da5f5b1cf8244d4a365、ストリップなし
このパッチを適用します: https :
構成、設定
./configure --without-openssl --host = arm-none-linux-gnueabi CC = arm-linux-gnueabi-gcc LD = arm-linux-gnueabi-ld CXX = arm-linux-gnueabi-g ++ CFLAGS = -static CXXFLAGS = -static --enable-static --disable-shared --prefix = / home / doru / Desktop / iperf3 / output
上記の手順を使用して(iperf3ではなく)iperf2をビルドすると、静的にリンクされた実行可能ファイルが生成されます。
doru @ doru-N551JK :〜/ Desktop / iperf-2.0.5 / output / bin $ file iperf
iperf:ELF 32ビットLSB実行可能ファイル、ARM、EABI5バージョン1(SYSV)、静的リンク、GNU / Linux 2.6.32、BuildID [sha1] = 631918d87fb90840809bb5e5aa5b3d613bf1a775、ストリップなし
構成を修正する必要があります。
これが問題であることを確認しました(CentOS7とFreeBSD11でテストされ、どちらもネイティブコンパイルであり、別のプラットフォームにクロスビルドする必要はありません)が、理由はまだわかりません。 この構成機能を頻繁にテストすることはありませんが、過去のある時点で機能しているのを見たことがあります。 何らかの理由でconfigure.ac
LT_INIT
を実行しないことに気付きましたが、これが要因であるかどうかはわかりません。
iperf2とiperf3は、ビルドインフラストラクチャが異なる完全に別個のプログラムであることに注意してください。
また、これは本当にlibtoolと関係があると思いますが、これは私の専門ではないので、libtoolのスキルを持っている人がいれば、助けていただければ幸いです。
わかった。 一部のCentOS7VMでこれを少し再検討しました。 --enable-static --disable-shared
は、共有ライブラリが構築されないことを意味することを再学習しました(この場合はlibiperf.so
)。 CFLAGS=-static
は静的リンクを実行しようとしますが、 libc-static
RPMの静的Cライブラリがインストールされている必要があります。 また、SCTPサポートはこのプラットフォームでのビルドを壊す可能性があります。なぜなら、私が知る限り、静的ライブラリ(ダイナミックライブラリのみ)を含むCentOS7にはlksctp-*
パッケージがないからです。
これはすべて、静的にリンクされたiperf3実行可能ファイルを実際に構築するのにも問題があることを意味しますが、それはiperf3の何かが原因ではありません。
これは確かに、5年以上前から議論されてきたlibtoolの問題です。 重要:libtoolは静的リンクを不可能にしますを参照してください。
iperf
修正する最善の方法がわかりません。 現時点では、回避策のみを提案できます。
configure
実行した後、静的にiperf3
をビルドするにconfigure
replace
155-157行のsrc/Makefile
iperf3_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(iperf3_CFLAGS) $(CFLAGS) \
$(iperf3_LDFLAGS) $(LDFLAGS) -o $@
と
iperf3_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) -all-static $(iperf3_CFLAGS) $(CFLAGS) \
$(iperf3_LDFLAGS) $(LDFLAGS) -o $@
つまり、 $(CCLD)
直後に-all-static
挿入します。
問題は、libtoolがコンパイラに与えられた-static
オプションを独自のMODE-ARGとして扱い、コンパイラのコマンドラインから削除することです。
おそらく、より良い回避策は、設定することですLDFLAGS=--static
実行するときにconfigure
。 余分なマイナスに注意してください。
例えば:
configure "LDFLAGS=--static" --disable-shared
これにより静的実行可能ファイルがビルドされますが、次の警告が生成されます。
warning: Using 'getaddrinfo' in statically linked applications requires at runtime the
shared libraries from the glibc version used for linking
@ d1mach :情報と回避策をありがとう...それは非常に興味深いです!
この回避策は、CentOS 7(x86_64)でネイティブにコンパイルする場合に問題なく機能しました。 glibc-static
インストールされたマシンが必要でしたが、 lksctp-*
ものはありませんでした。 また、OpenSSLを使用してビルドしませんでした(使用していたテストVMにはopenssl-devel
がありません
クロスコンパイル環境でこれがどのように機能するかわかりません...
解決策は私には問題ありません。
どうもありがとう!
私はおそらくFAQのためにこれを書く必要があります...私はあなただけが静的実行可能ファイルを構築したい/構築する必要がある人ではないことを賭けます。 楽観的にこの問題を開いたままにして、これを行うように私に思い出させます。
835ec5fにFAQエントリを追加し、終了しました。 情報と議論をありがとう!
@ d1machありがとうございます。 私は問題に大きな問題を抱えています。 あなたの答えは私にとってうまくいきます。
@ d1machこれからもよろしくお願いします。 その「-static」トリックは、何が悪かったのかを完全には理解しておらず、修正を求めてインターネットを調べたものです。 これで解決し、将来的には重宝します。 とても有難い。
最も参考になるコメント
おそらく、より良い回避策は、設定することです
LDFLAGS=--static
実行するときにconfigure
。 余分なマイナスに注意してください。例えば:
これにより静的実行可能ファイルがビルドされますが、次の警告が生成されます。