3

.a静的に作成されたライブラリを別の C コードにリンクしようとしています。

ただし、最終的な実行可能ファイルでは、nmコマンドで見ると、いくつかのシンボル (関数名) が欠落していることがわかります。これは、リンカー (gcc呼び出されている) が、ライブラリにリンクされている他のCコードで参照されていないシンボルを削除しているためです。nmコマンドで見つけようとしている関数シンボルが.aライブラリに表示されます。

このように省略されたシンボルをリンカが取り除かないようにするにはどうすればよいですか?

4

3 に答える 3

1

-dynamicを指定してgccでコンパイルし、コンパイラーにすべてのシンボルを含めるように強制します。しかし、それは無駄なので、それが本当に欲しいものであることを確認してください。

一部の静的ファクトリパターンに役立つ場合があります。

于 2010-01-20T07:18:22.527 に答える
1

一般に、リンカーは他のシンボルを削除します-主に

  • 実行可能ファイルの最終サイズを縮小する
  • プログラムの実行速度を上げる

ここには 2 つの思考の流れがあります。

  • オプション -O を gcc コマンド ラインの一部として使用すると、コードが最適化され、すべてのデバッグ情報が取り除かれるため、リンカーは自動的に同じことを行います。
  • オプション -g を gcc コマンド ラインの一部として使用すると、すべてのデバッグ情報が含まれるため、デバッガーでシンボルを変更せずに実行可能ファイルを読み込むことができます。

本質的に、これら 2 つは相互に排他的です。両方を組み合わせることはできません。

したがって、これが発生するために使用したスイッチによって異なります。通常、-gスイッチは公開リリース前の内部デバッグおよびテスト用です。反対に-O2、デッド変数の削除、ループのアンロールなど、最適化されていると見なされる実行可能ファイルを生成するのに十分なほどコンパイラをスマートにします。

これが役に立ち、ヒントになることを願っています

于 2009-12-10T14:44:16.773 に答える
1

通常、このような参照を生成するには、アプリケーションで何らかの登録関数を呼び出す必要があります。もちろん、最初のライブラリのコードにアクセスできない場合は、 tommieb75 が説明した -g オプションしか使用できません。

于 2009-12-10T14:46:32.997 に答える