2013年1月26日土曜日

asmregparmとは

 Linux 2.6.32 のビルドに失敗した。そのときに気になったasmregparmを調べたので報告。

ソースコードの取得とビルド

% git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux
% cd linux
% git checkout v2.6.32
% make oldconfig
% make menuconfig
% make
ここで失敗。

エラーメッセージを見ると、syscall_trace_leave関数の定義が違うとある(エラーメッセージは残してないので、覚えてる範囲で書く)。googleさんに聞くと、asm/x86/include/asm/ptrace.h の中の syscall_trace_leaveの定義に、asmregparm 修飾子が足りないとのこと[1]

このパッチを参考にコードを修正したところ、この問題は解決した。



asmregparmとは

で、asmregparm とは何か?答えは[2]にあります。ソースを探すと、arch/x86/include/asm/linkage.h の中に以下の定義があった。

#define asmregparm __attribute__((regparm(3)))

これは、型宣言時にregparm属性を付与する。__attribute__については、Unixwiz.netの記事[3]を参照のこと。regparm は、関数の引数をスタックではなく、eax, edx, および ecx レジスタに格納して渡すことを意味する。引数の 3 はレジスタに格納する変数の数。3 なら、第3引数まではレジスタに格納。詳細は、GNU の GCC Document [2] を参照。

参考:
[1] Patchwork x86: fix ptrace.o compile error, https://patchwork.kernel.org/patch/1301031/
[2] 5.24 Declaring Attributes of Functions, http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Function-Attributes.html
[3] Unixwiz.net - Software Consulting Central, Using GNU C __attribute__, http://unixwiz.net/techtips/gnu-c-attributes.html

0 件のコメント:

コメントを投稿