我正在编写一个非常轻量级的libc替换库,以便我可以更好地理解内核 - 应用程序界面.第一项任务显然是使一些系统调用包装器到位.我已经成功地获得了1到3个参数包装器,但我正在努力使用4参数varient.这是我的出发点:
long _syscall4(long type, long a1, long a2, long a3, long a4)
{
long ret;
asm
(
"syscall"
: "=a"(ret)
: "a"(type), "D"(a1), "S"(a2), "d"(a3), "r10"(a4)
: "c", "r11"
);
return ret;
}
Run Code Online (Sandbox Code Playgroud)
编译器给我以下错误:
error: matching constraint references invalid operand number
Run Code Online (Sandbox Code Playgroud)
我的_syscall3函数工作正常但不使用r10或有一个clobber列表.
有什么想法吗?
我们为嵌入式 powerpc 系统编译内核模块已经有几年了,总的来说,除了一些罕见的无法解释的稳定性问题之外,一切都还好。最近有同事指出,内核模块应该使用与内核相同的编译器来编译。经过一番挖掘后,我发现内核(montavista linux 2.4.20)是用gcc3.4.1编译的,而我们一直在使用(denx eldk)gcc4.0.0。我最近为我们的用户空间代码构建了 gcc4.7.1,但是加载使用此版本构建的内核模块会导致系统崩溃。然后我从源代码构建 gcc3.4.1 ,有些构建可以工作,有些则不能 - 我认为我的 make 脚本可能有问题,但那是另一个故事了。
所以我的问题是:我的同事正确吗?如果是这样,谁能解释一下生成的 .o 文件中有什么不同导致了不兼容?
这是一个代码片段,希望传达我正在尝试做的事情:
void updatePointer(const int*& i)
{
i++;
}
int main() {
int array[5];
int* arrayPtr = array;
updatePointer(arrayPtr );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这给编译器错误:
prog.cpp: In function ‘int main()’:
prog.cpp:16: error: invalid initialization of reference of type ‘const int*&’ from
expression of type ‘int*’
prog.cpp:5: error: in passing argument 1 of ‘void updatePointer(const int*&)’
Run Code Online (Sandbox Code Playgroud)