参照元†
- Kbuild と連携して定数を定義するヘッダファイルを生成するための命令。
- 例: asm-offsets.h(x86) の場合
ファイル生成の流れ:
arch/x86/kernel/asm-offsets.c --(Kbuild で実行する cpp)-->
arch/x86/kernel/asm-offset.s --(Kbuild で実行する sed)-->
include/generated/asm-offset.h
----------
まず Kbuild の依存関係定義から、
asm-offsets.c をプリプロセッサで処理する。
gcc (引数略) -S -o arch/x86/kernel/asm-offsets.s \
arch/x86/kernel/asm-offsets.c
すると、
DEFINE(PAGE_SIZE_asm, PAGE_SIZE)
は、
->PAGE_SIZE_asm $4096 PAGE_SIZE #
のようなコードになる。
下記のような sed で置換する。
sed -ne '/^->/{s:->#\(.*\):/* \1 */:; \
s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; \
s:->::; p;}' arch/x86/kernel/asm-offsets.s
すると、
->PAGE_SIZE_asm $4096 PAGE_SIZE #
は、
#define PAGE_SIZE_asm 4096 /* PAGE_SIZE # */
のようなコードになる。
- 引数省略しないバージョン
gcc -Wp,-MD,arch/x86/kernel/.asm-offsets.s.d \
-nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.3.2/include \
-I/usr/src/linux-2.6.33/arch/x86/include -Iinclude \
-include include/generated/autoconf.h -D__KERNEL__ \
-Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
-fno-strict-aliasing -fno-common \
-Werror-implicit-function-declaration \
-Wno-format-security -fno-delete-null-pointer-checks \
-Os -m32 -msoft-float -mregparm=3 -freg-struct-return \
-mpreferred-stack-boundary=2 -march=i686 -mtune=core2 \
-Wa,-mtune=generic32 -ffreestanding -DCONFIG_AS_CFI=1 \
-DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare \
-fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 \
-mno-3dnow -fno-stack-protector -fno-omit-frame-pointer \
-fno-optimize-sibling-calls -Wdeclaration-after-statement \
-Wno-pointer-sign -fno-strict-overflow \
-D"KBUILD_STR(s)=#s" \
-D"KBUILD_BASENAME=KBUILD_STR(asm_offsets)" \
-D"KBUILD_MODNAME=KBUILD_STR(asm_offsets)" \
-fverbose-asm \
-S -o arch/x86/kernel/asm-offsets.s \
arch/x86/kernel/asm-offsets.c
- sym
- val
- 定義する値
- 最終的に .h には、
#define sym val
のような定義が生成される。
詳細は DEFINE() の説明を参照してください。
返り値†
#define DEFINE(sym, val) \
asm volatile("\n->" #sym " %0 " #val : : "i" (val))
コメント†