2017-06-05 11 views
1

4.3.3から4.9.4へのアームクロスコンパイラの更新中です。私が見ている1つの問題は、新しいコンパイラが自動的に依存ライブラリを自動的には含まないことです。たとえば、次のようにgccリンカは自動的に依存関係ライブラリを含まない

gccの... -L -l -lssl -lrt

は、以前のコンパイラで正常に動作します。 libsslがlibcryptoで何かを参照する必要がある場合、リンカーは自動的にlibcryptoを見つけてリンクします(-lcryptoは必要ありません)。

新しいコンパイラでは、これはまだ動作しますが、libsslがlibcrypto内の何も参照していない場合のみです。存在する場合は、-lcyrptoが必要です。 -lpthread、-ldlなどにも同じ問題があります。

これはgccの動作の変更ですか、gccをビルドするときに正しく設定されていないものですか?

答えて

1

静的または動的ライブラリを使用していますか? libssllibcryptoに依存する場合、動的ライブラリについては、あなたがlibcryptoからシンボルのプログラムで直接利用したい場合は、明示的に自身が正しくリンクされたlibssl限り-lcryptoをリンクする必要がありますが、していない、あなたがする必要はありそれを明示的にリンクする。これはbinutilsの新しいバージョンでの変更/意図的回帰です。

+0

これらはダイナミックライブラリです。 binutilsも2.18から2.28に更新されています。だから私はこれがbinutils(ld)リンカの意図的な変更だと言っていると思います。 – Jay

+0

@Jay:binutilsの変更は、アプリケーションが明示的な '-lcrypto'なしで' libcrypto'のシンボルを使用している場合にのみ影響します。 'libssl'の' libcrypto'からのシンボルの使用は、 '-lcrypto'がなくても、動的ライブラリが依存情報を保存しているので、依然として問題ありません。 –

+0

私の経験は、あなたが言ったことに対する私の理解と一致しません。私は空のmain()関数を使って簡単なテストCファイルを作成し、コンパイルしてライブラリ(-lfoo)とリンクしました。 libfooは-lsslと-lcryptoでリンクされていますが、objdump -xはlibsslとlibcryptoをNEEDEDとしてリストしていることを示しています。古いコンパイラでは、私のテストプログラムはうまくコンパイルされます。更新されたコンパイラでは、コンパイルしているCファイルに-lsslと-lcryptoを追加しない限り、それらのライブラリへの参照はありません。 – Jay

関連する問題