2018年01月30日

GCCでカスタムセクションを指定した時に自動生成されるシンボル

glibc のテストスイートを確認していた所、string/test-string.h にて以下のようなシンボルが使われていたのですが、このシンボルの出所が全くわからなくてしばらく悩んだので、その正体をメモしておきます。
extern impl_t __start_impls[], __stop_impls[];


Map ファイルにも、プリプロセス後のファイルにも、アセンブラファイルにも、アセンブル後のオブジェクトファイルにも、どこにも定義やシンボルが存在しないのに、リンク後の ELF ファイルのシンボルテーブルには確かに存在するのです。

結論から言うと、これは
#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

kmckk at 17:34コメント(0)GCC | 若槻 

コメントする

名前
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード