😎
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でいう、
COMDAT
flagと同等のもの
-
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