😎
MachOにおけるSymbolのType
-
defined external symbol
- このMachOファイルで定義されているexternal symbol
int x = 0; -
undefined external symbol
- このMachOファイルで定義されていないexternal symbol
extern int x; -
common symbol
- 複数のオブジェクトファイルに現れうるsymbol
- C言語では、初期化されていないかつ
extern宣言されてないグローバル変数は common symbol として出力される
int x; -
private defined symbol
- 他のモジュールからみえないsymbol
static int x = 0; -
private external symbol
- このMachOファイルの他のモジュールからのみ見えるexternal symbol
- それ以外のモジュールからはprivateになる
- 標準的なstatic linkerは、private external symbolをprivate defined symbolに置き換える(明示的に指定した場合を除く)
__private_extern__ int x = 0; -
weak reference
- undefined external symbolのうち、プログラムをリンクするために解決される必要はないもの
- symbolが見つからなければ、dynamic linkerはそのアドレスを0に設定する
- Mac OS X v10.2以降で使える
- ↓のように使える
/* Only call this API if it exists */ if( SomeNewFunction != NULL ) SomeNewFunction();-
weak_importアトリビュートを明示的に指定する必要がある
void SomeNewFunction(void) __attribute__((weak_import)); -
coalesced symbol
- 複数のオブジェクトファイルで定義されうが、static linkerがそのうちの1つのコピーのみを生成するようなsymbol
- C++のいくつかの言語仕様で、メモリ使用率を大幅に下げることができる
- virtual function table
- runtime type information
- C++ template instantiations など
- 明示的に指定することはできない
- 他のOSでいう、
COMDATflagと同等のもの
-
weak definition
- weak definitionは、他のnon-weakな同等なsymbolがない限り、linkerに無視される
- 標準的なC++コンパイラで使用される(C++ template instantiationsをサポートするため)
- コンパイラは、暗黙的な(かつ明示的でない)template instantiationsをweak definitionにする
- そうすることで、static linkerは explicit な template instantiation を implicit なものよりも優先することができる
- Mac OS X v10.2以降で使える
-
debugging symbol
- デバッガーが、マシンコード上のアドレスとソースコードの位置を紐づけるためのsymbol
- 標準的なコンパイラは、
stabフォーマットのdebugging symbolを生成する- GDBデバッガのドキュメントに記述されている
Discussion