注目★★★★★Lobsters
GCC 16、ネストされた関数がトランポリンなしで動作可能に
30秒で把握
- 1GCC 16 は親変数に非アクセスなネストされた関数でトランポリン不要化・実行可能スタック廃止に対応
- 2wide pointer と __builtin_call_with_static_chain により、変数キャプチャ付きコールバックもトランポリンレスで実装可能に
- 3コンパイラが単一命令に最適化・clang 互換性は将来課題・セキュリティと性能の両立を実現
要約
GCC 16 では、親関数の変数にアクセスしないネストされた関数がトランポリン (スタック上の実行可能コード片) を必要としなくなった。従来、ネストされた関数のアドレス取得時に GCC はトランポリンを動的生成していたが、実行可能スタックというセキュリティ機能を無効化させていた。Martin Uecker が開発した `__builtin_call_with_static_chain` と新しい組み込み関数により、wide pointer 型を使ってトランポリン不要のコールバック実装が可能になった。マクロで wrapper を定義すれば、コンパイラはこれを単一の CPU 命令に最適化できる。この変更はポータビリティに課題があるため、将来的に clang との互換性についても検討予定。
あなたへの影響
ネストされた関数を活用している C コード (特にコールバック処理) がある場合、GCC 16 への更新で実行可能スタックを無効にしたままでも動作確認を推奨する。
推奨:wide pointer マクロと組み込み関数の組み合わせは clang では未サポートのため、複数コンパイラ対応が必要なプロジェクトではトランポリン回避の検証方法を事前に確立が必要。