2018年01月30日
GCCでカスタムセクションを指定した時に自動生成されるシンボル
glibc のテストスイートを確認していた所、string/test-string.h にて以下のようなシンボルが使われていたのですが、このシンボルの出所が全くわからなくてしばらく悩んだので、その正体をメモしておきます。
extern impl_t __start_impls[], __stop_impls[];
Map ファイルにも、プリプロセス後のファイルにも、アセンブラファイルにも、アセンブル後のオブジェクトファイルにも、どこにも定義やシンボルが存在しないのに、リンク後の ELF ファイルのシンボルテーブルには確かに存在するのです。
結論から言うと、これは
正確には GCC は単に
参考:Hacking Your ELF For Fun And Profit
結論から言うと、これは
#define IMPL(name, test) \ impl_t tst_ ## name \ __attribute__ ((section ("impls"), aligned (sizeof (void *)))) \ = { __STRING (name), (void (*) (void))name, test };で、impls というカスタムセクションが指定されていて、どうも GCC でこの attribute を使用して SECTION を指定すると、そのセクションの最初と最後に __start_SECTION/__stop_SECTION シンボルが生成されるようなのです。
正確には GCC は単に
.section impls,"aw",@progbits指令を生成するだけで、GNU as も何もしないようなので、GNU ld がリンク時に自動生成しているのだと思いますが、マニュアル中にこのような仕様を見つけることはできませんでしたし、参考にした以下のサイトでもこの機能に関する公式ドキュメントを見つけることはできなかったと書いてます。(確認に使用したのは現在最新の安定版 GCC 7.2/Binutils 2.29.1 の AArch64 ターゲットです。)
参考:Hacking Your ELF For Fun And Profit