2009-08-11 17 views
2

VC++ 2008とGCCで共有ライブラリ(.dll、.so)を構築しました。 問題は、両方のlibsの中にプライベートシンボル(クラス、関数)の名前が表示され、それらがエクスポートされなかったことです。C++共有ライブラリに内部シンボルが表示されます

エクスポートしていないクラスや関数の名前を表示させたくありません。 私はそれを行うことはできますか? VCで は-fvisibility =隠しでコンパイルして、属性で公開した((可視性( "デフォルト")))

++::私はGCCで

__declspec(のdllexport)

ありがとう!

+1

TheClientIsAPinhead()のようなメソッドに名前を付ける習慣がない限り、私はあなたの問題が本当にわかりません。 –

+0

あなたはそこにポイントを持っていますが、私は妄想的であり、他の人がクラスと機能に関してプログラムの構造をチェックしないようにしています。輸出されたシンボルのみを持つ共有ライブラリが必要です。 – AllDayCpp

+0

「ショー」と言ったらどういう意味ですか?それは何ですか"? –

答えて

1

GNUツールチェーンでは、ストリップコマンドを使用してオブジェクトファイルからシンボルを削除できます。その動作を制御するには、さまざまなコマンドオプションが必要です。それはあなたが望むことをするかもしれません。

+0

既にそれをしました。それはいくつかの記号を削除しますが、すべてを削除しません – AllDayCpp

0

プライベートキーワードは、アクセス仕様でのみ使用された場合、 はコンパイル時に効果的に動作し、セキュリティ機能ではなくプログラマの援助を目的としています。

2つの別々の.cppファイルで互いに依存関係を持つ2つのプライベート関数を実装する場合、結果のオブジェクト(またはライブラリ)ファイルでプライベート名を見つける必要があります。

ボトムライン - C++にはコードセキュリティ機能はありません。誰かにプログラムのオブジェクトコードを渡すと、常にそのコードを調べることができます。

+0

私はELFまたはPE実行形式のシンボルについて話しています。プライベートキーワードではありません。 – AllDayCpp

+0

C++タグを質問から削除する必要がありますか? –

1

ヘッダーファイルを作成して、の非表示にする機能とメソッド名を難読化することができます。つまり、以下のようなものです(ガードも含む必要があります)。

#define someFunctionName1 sJkahe28273jwknd 
#define someFunctionName2 lSKlajdwe98 
#define someMethodName1 ksdKLJLKJl22fss 
#define someMethodName2 lsk89hHHuhu7g 

...実際の定義が存在するヘッダーファイルにこれを含めます。

+0

大規模なプロジェクトでそれを行うのは素朴ではなく、define ... Evilソリューションでコードを汚染します。 – AllDayCpp

+0

私は、それらを1つのファイルに保存することをお勧めします。あなたは後で任意のコードでそれらを見ることはできません。いくつかのヘッダーには「インクルード」だけがあります。すべての関数/メソッドを難読化する必要がある場合は、いくつかのパーサを使用して抽出する必要があります。あなたがいくつかの重要なコア機能を持っていれば、手動で処理するのがいいでしょう。事はコードが同じであることです、バイナリの名前は難読化されます。何らかのランダムな識別子を使う代わりに、別のfunc /メソッド名を書いて、うまくいけば再エンジニアをオフにすることができます。すなわちcalculateSecretKey() - > prepareNewDatabase() – epatel

関連する問題