initcall なマクロ

一昨日のナニは本当に正しいのか、と言いつつ。
ええと置換した後のソレが以下と書いた。

	static initcall_t __initcall_populate_rootfsrootfs __attribute_used__ \
	__attribute__((__section__(".initcall" "rootfs" ".init"))) = populate_rootfs;

で、本当かいな、と言いつつ google 先生経由で gcc拡張機能なドキュメントを見ても微妙な output しかない。仕方ないなぁ、と言いつつ以下

$ find -name "*.[ch]"|xargs grep '\.initcall'
./include/asm-generic/vmlinux.lds.h:    *(.initcall0.init)                                              \
./include/asm-generic/vmlinux.lds.h:    *(.initcall0s.init)                                             \
./include/asm-generic/vmlinux.lds.h:    *(.initcall1.init)                                              \
./include/asm-generic/vmlinux.lds.h:    *(.initcall1s.init)                                             \
./include/asm-generic/vmlinux.lds.h:    *(.initcall2.init)                                              \
./include/asm-generic/vmlinux.lds.h:    *(.initcall2s.init)                                             \
./include/asm-generic/vmlinux.lds.h:    *(.initcall3.init)                                              \
./include/asm-generic/vmlinux.lds.h:    *(.initcall3s.init)                                             \
./include/asm-generic/vmlinux.lds.h:    *(.initcall4.init)                                              \
./include/asm-generic/vmlinux.lds.h:    *(.initcall4s.init)                                             \
./include/asm-generic/vmlinux.lds.h:    *(.initcall5.init)                                              \
./include/asm-generic/vmlinux.lds.h:    *(.initcall5s.init)                                             \
./include/asm-generic/vmlinux.lds.h:    *(.initcallrootfs.init)                                         \
./include/asm-generic/vmlinux.lds.h:    *(.initcall6.init)                                              \
./include/asm-generic/vmlinux.lds.h:    *(.initcall6s.init)                                             \
./include/asm-generic/vmlinux.lds.h:    *(.initcall7.init)                                              \
./include/asm-generic/vmlinux.lds.h:    *(.initcall7s.init)
./include/linux/init.h: __attribute__((__section__(".initcall" level ".init"))) = fn
./arch/um/include/init.h:#define __uml_init_call                __attribute_used__ __attribute__ ((__section__ (".uml.initcall.init")))
./arch/um/include/init.h:       __attribute__((__section__(".initcall" level ".init"))) = fn
./arch/um/include/init.h:#define __init_call    __attribute_used__ __attribute__ ((__section__ (".initcall.init")))
$

一応 .initcallrootfs.init というセクションがある模様。

ちなみに上記は include/asm-generic/vmlinux.lds.h にて以下な記述らしい。

#define INITCALLS                                                       \
        *(.initcall0.init)                                              \
        *(.initcall0s.init)                                             \
        *(.initcall1.init)                                              \
        *(.initcall1s.init)                                             \
        *(.initcall2.init)                                              \
        *(.initcall2s.init)                                             \
        *(.initcall3.init)                                              \
        *(.initcall3s.init)                                             \
        *(.initcall4.init)                                              \
        *(.initcall4s.init)                                             \
        *(.initcall5.init)                                              \
        *(.initcall5s.init)                                             \
        *(.initcallrootfs.init)                                         \
        *(.initcall6.init)                                              \
        *(.initcall6s.init)                                             \
        *(.initcall7.init)                                              \
        *(.initcall7s.init)

上記によれば数字の小さい順、ではなくて記述順、と見て構わないように思えるんですが、根拠はゼロです。