Xcodeでバイナリのシンボルを隠蔽したよ

Xcode で普通にビルドすると、非公開メソッドも含めてシンボル名がすべて見えてしまうので、これを隠すための手順です。

Xcode のプロジェクト設定を変更するとすべてのメソッドのシンボルを隠すことができます。
ただ、これだけだと全部隠れてしまっているのでライブラリとして使えなくなってしまいます。
なので、隠したあとには公開したいメソッドにだけ、宣言を修正することになります。
こういう設定は、どこか一箇所を変えるだけでできると楽なのですが一箇所ではなかったです。

シンボル名はプロジェクトの Build Settings を変更すれば消える

一箇所ではないと言いつつも、さほど面倒ではないです。
Xcode のプロジェクト設定から、以下の項目を変更するだけです。

  • Build Settings – Deployment
    Strig Style: Non-Global Symbols

  • Build Settings – Apple LLVM 7.0 – Code Generation
    Generate Debug Symbols: No
    Symbols Hidden by Default: Yes

これで、バイナリに含まれるシンボル名が消えます。

消えているかどうか確認する

シンボルが消えているかどうかは、ターミナルから nm コマンドで確認できます。

nm "ファイルパス"

出力結果に、ライブラリ内に定義しているメソッド名が表示されていなければ OK です。

公開メソッドを指定する

次に公開したいメソッドの宣言を修正します。

ヘッダファイルの宣言を以下のように変えることで、Xcode のシンボル隠蔽から除外できます。

extern __attribute__ ((visibility("default"))) bool foobar();

公開されているかどうか確認する

手順は消えているかどうかを確認したときと同じです。nm コマンドを使います。
シンボル隠蔽から除外したメソッド名が出力に含まれていれば OK です。

おしまい。

スポンサーリンク