😎

MachOにおけるSymbolのType

2021/05/23に公開
  • 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