Iperf: 構成は静的にリンクされた実行可能ファイルを生成しません

作成日 2017年08月14日  ·  12コメント  ·  ソース: esnet/iperf

環境

  • 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、ストリップなし

構成を修正する必要があります。

bug

最も参考になるコメント

おそらく、より良い回避策は、設定することです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

全てのコメント12件

これが問題であることを確認しました(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」トリックは、何が悪かったのかを完全には理解しておらず、修正を求めてインターネットを調べたものです。 これで解決し、将来的には重宝します。 とても有難い。

このページは役に立ちましたか?
0 / 5 - 0 評価