2011-01-17 13 views
2

私は3つの部分でこの質問を分けます:私は静的ライブラリおよびそのシンボルオフストリップを生成したいVisual Studioで生成された静的ライブラリは、シンボルを削除できますか?

  1. 。 (デバッグ情報は既に含まれていません) linuxのstripコマンドに似ています。それはできますか?

  2. Windows envに相当するツールがありますか?nmツールですか?

  3. VS2008を使用して静的ライブラリを作成する場合。 を除いて、生成された.objファイルをビルドから静的ライブラリから除外するスクリプトを定義することは可能ですか?
    ダイナミックでもかまいませんか?私は、スクリプトでコンパイルモードを定義したいと、これは、特定のオブジェクト・ファイルをビルド

+3

シンボルのないライブラリは、書き込み専用メモリと同じくらい有用です。 – TonyK

答えて

1
  1. から除外されていることになるわけはありません、あなたはどのように静的ライブラリのユーザがリンクと思います彼らが使用するシンボルがどこにあるのかを知らずに
  2. はい、DUMPBINユーティリティを試してください。
  3. まあ、はい。 /REMOVE:fooLIBユーティリティを実行できます。

しかし、私はあなたがやる価値がないか、ライブラリのメンバーを削除するよりもずっと簡単にできることをしていると思います。

3

「静的な」キーワードを使用して宣言してください。これは、現在のモジュールだけがアクセス可能であることをコンパイラーに通知します。

+1

これは作業の半分しか行いません。ライブラリにはまだシンボルが含まれていますが、削除することができます:Linuxでは、 'strip -x ...'によって、Windowsでは、私はどのようにわかりません - それが質問です! – anatolyg

+2

実際には、静的関数と静的関数の2つの関数を宣言した単純なファイルをコンパイルしましたが、静的関数は.libファイルには表示されません(16進エディタで検証されます)。これはOPが望んでいることをしているようです。 – Jimbo

+0

最終的なライブラリから個々のシンボルを削除する方法が見つかりません。別の回答に記載されている/ REMOVEオプションは、.objファイル全体を出力ライブラリから削除するようです。 – Jimbo

0

VS2010で作成された.objファイルでは、静的関数の名前の一部(すべてではありません)を検索し続けました。興味深いことに、それらはリリース.objファイルでは表示されましたが、デバッグ.objファイルでは表示されませんでした。私は、「プログラム全体の最適化=はい」に設定(「/ GL」)にそれを突き止め

$ strings myObjectFile.obj | grep myStaticFunctionName 

:私はちょうど、検索を実行するためにcygwinの文字列を使用していました。これを「いいえ」に変更すると、関数名は表示されなくなりました。

アップデート:フォローアップテストとして、私はvimに "cleansed" myObjectFile.objをオープンしましたが、まだそれらを見つけることができます(set encoding = utf-8または:set encoding = latin1)。なぜ文字列にマッチがないのか分かりません。しかたがない。

2

少数の "エクスポートされた"パブリックシンボル以外のすべてを取り除くことが便利な場合がありますが、実際には実現可能ではありません。

静的ライブラリは、.objファイルのコレクションにすぎません。内部依存関係はまだ解決されておらず、リンク時まで解決されません。

たとえば、.libがfoo.objとbar.objで構成され、foo.objの呼び出しがbar.objで定義された関数にある場合、そのシンボルはリンク時に使用可能でなければなりません図書館の外には何も見えません。

このため、(ファイルスコープの静的シンボルを除いて)シンボルを削除することはできません。可視性の適用はリンク時ではなくコンパイル時の問題であるため、シンボル表に保護されたクラスメソッド(C++の意味で)も存在します。

これに対して、ダイナミックライブラリは、既にリンクされているスタンドアロンバイナリです。 foo.objからbar.objへの参照は既に解決されています。したがって、エクスポートされなければならない記号(および名前を変更したり、序数で置き換えることさえできるもの)を除いて、DLLを削除することができます。

DLLが単純なC APIを公開している場合は、すべて設定されています。しかし、C++クラスを公開したい場合は、おそらく保護されたメソッドと非公開のメソッドのすべてのメソッドをエクスポートすることになります(外部アプリケーションのインライン展開によってプライベートメソッドが直接呼び出される可能性があります)。

+0

私はdownvoteについて興味があります。誰でも私の答えを改善できるようにコメントしてください。 –

+0

答えの最初の文は、私たちも達成しようとしているものです。これまでのオプションは、1)不必要なシンボルをすべて静的に宣言し、2)名前のない名前空間に不要なシンボルを入れ、3)不必要なシンボルをゴミに改名する。最初の2つのオプションを1つのビルドと組み合わせて、プライベートなクロスオブジェクトのシンボルが不要になるようにしてください。 – astraujums

関連する問題