小编Fen*_*r34的帖子

在gcc内联x86_64汇编中约束r10寄存器

我正在编写一个非常轻量级的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列表.

有什么想法吗?

c gcc x86-64 system-calls inline-assembly

9
推荐指数
2
解决办法
1618
查看次数

gcc 版本对内核模块重要吗

我们为嵌入式 powerpc 系统编译内核模块已经有几年了,总的来说,除了一些罕见的无法解释的稳定性问题之外,一切都还好。最近有同事指出,内核模块应该使用与内核相同的编译器来编译。经过一番挖掘后,我发现内核(montavista linux 2.4.20)是用gcc3.4.1编译的,而我们一直在使用(denx eldk)gcc4.0.0。我最近为我们的用户空间代码构建了 gcc4.7.1,但是加载使用此版本构建的内核模块会导致系统崩溃。然后我从源代码构建 gcc3.4.1 ,有些构建可以工作,有些则不能 - 我认为我的 make 脚本可能有问题,但那是另一个故事了。

所以我的问题是:我的同事正确吗?如果是这样,谁能解释一下生成的 .o 文件中有什么不同导致了不兼容?

gcc kernel embedded-linux

5
推荐指数
1
解决办法
3392
查看次数

为什么我不能将非const指针传递给一个函数,该函数将一个指向const的指针作为其参数

这是一个代码片段,希望传达我正在尝试做的事情:

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)

c++ pointers const reference

4
推荐指数
2
解决办法
3585
查看次数