2

C++実行可能ファイルを作成しています。カスタムライブラリを含め、使用しているCおよびC++ライブラリのいくつかを静的にリンクしています。(ただし、使用しているすべてのライブラリを静的にリンクしているわけではありません。)

それを考慮しても、実行可能ファイルは異常に大きいように見えました。を使用したところ、予想よりもobjdump -hはるかに多くのスペースを使用していることがわかりました。.dynstrでコンパイルし-Osて実行しましたstripが、実行すると

$ readelf -p .dynstr slamshift

私は次のような多くのエントリを取得します

  [ 13588]  _ZN3yuu6windowC2Ev
  [ 1359b]  _ZTSN3yuu7gfx_ctxE
  [ 135ae]  _ZN4YAML7Scanner11ScanFlowEndEv
  [ 135ce]  __glewVertexFormatNV

静的にリンクしたライブラリ(私自身のライブラリ、yaml-cpp、およびGLEW)のシンボルの場合。

これらのシンボルが実行可能ファイルに表示されるのはなぜですか?関連するライブラリを静的にリンクした場合、シンボル名は不要ではありませんか?

Ubuntu 12.04、GCC 4.6.3、CMakeとそのデフォルト設定を使用してビルドしています(関連する場合)。

4

2 に答える 2

4

これらのシンボルが実行可能ファイルに表示されるのはなぜですか?

これらのシンボルが実行可能ファイルからエクスポートされ、動的シンボルテーブルに表示される理由は2つだけです。

  1. 実行可能ファイルを--export-dynamic(別名-E)リンカーフラグにリンクした、または
  2. リンクに参加している他の共有ライブラリは、これらのシンボルを参照しています。

あなたが#1をしているなら、答えは簡単です:それをしないでください。

#2のためにシンボルをエクスポートした場合は、本当にシンボルをエクスポートする必要があります。そうしないと、コードが他の場所で失敗する可能性があります。

于 2012-05-12T03:40:28.207 に答える
1

ELF実行可能ファイルがdl_openとその仲間を使用して動的オブジェクトとして開くことができるということはほとんど知られていない事実です。それが機能するためには、シンボルのエクスポートが必要です。それがここで起こっていることだと思います。

--exclude-libs ALLリンカを使用して、最終的なプログラムリンクを実行してみることができます。-Wl,--exclude-libs ALLgccコマンドラインのようになります。
更新:これにより、シンボルはまだ存在しますが、非表示としてマークされます。

また、試してみてください-Wl,--exclude-all-symbols
更新:私はこれについて間違っていました。PEターゲット専用です。

私はこれを試しましたが、うまくいきました:
gcc -static -Wl,-s export-test.c

于 2012-05-11T17:49:20.730 に答える