1. ホーム
  2. c++

[解決済み】__attribute__((constructor))は具体的にどのように機能するのですか?

2022-04-30 23:58:47

質問

設定することになっているのは間違いなさそうですね。

  1. 具体的にはいつ実行されるのですか?
  2. なぜ括弧が2つあるのですか?
  3. __attribute__ 関数ですか?マクロか?シンタックス?
  4. これはC言語で動作しますか?C++?
  5. 動作させる関数は静的である必要がありますか?
  6. というのは __attribute__((destructor)) を実行しますか?

Objective-Cの例 :

__attribute__((constructor))
static void initialize_navigationBarImages() {
  navigationBarImages = [[NSMutableDictionary alloc] init];
}

__attribute__((destructor))
static void destroy_navigationBarImages() {
  [navigationBarImages release];
}

解決方法は?

  1. 共有ライブラリがロードされたときに実行されます。通常はプログラムの起動時に実行されます。
  2. GCCの属性はすべてそうなっています。おそらく、関数呼び出しと区別するためでしょう。
  3. GCC特有の構文です。
  4. はい、これはCとC++で動作します。
  5. いいえ、この関数は静的である必要はありません。
  6. デストラクタは、共有ライブラリがアンロードされたとき(通常はプログラムの終了時)に実行されます。

つまり、コンストラクタとデストラクタが機能する方法は、共有オブジェクト ファイルに特別なセクション (ELF では .ctors と .dtors) があり、そこにはそれぞれコンストラクタとデストラクタの属性が付いた関数への参照が含まれているということです。ライブラリのロード/アンロード時にダイナミックローダプログラム(ld.soなど)がそのようなセクションが存在するかどうかをチェックし、存在する場合はそこで参照される関数を呼び出します。

そういえば、通常のスタティック・リンカーにも似たようなマジックがあり、ユーザーがスタティック・リンクとダイナミック・リンクのどちらを選択しても、起動時やシャットダウン時に同じコードが実行されるようになっているはずです。