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