linux - 内核中的奇怪锁定

标签 linux gcc arm llvm clang

基本上,我在忙于从 mach 目标文件加载目标代码并将其链接到 Linux 内核,并且当我从该对象内部执行 printk 时,我注意到了一些奇怪的事情。如果我用超过 3 个(4 个或更多)参数调用 printk (printk("%d,%d,%d\n", 1, 1, 1)),系统将锁定,但在稍后的某个时间点(它不会从系统调用返回而只是锁定)。 在所有情况下,实际打印都有效并打印出预期值。

现在,奇怪的是只有在我使用 Clang+LLVM 构建它时才会发生这种情况。这是罪魁祸首代码:

Bad Clang

另一方面,当它是使用 LLVM GCC 构建时,它工作得很好:

LLVM GCC

这在使用 GNU GCC 构建时也有效:

GNU GCC

谁能提出 clang 版本导致系统锁定的原因?所以基本上,导致系统锁定的第一段代码有问题,但在其他。我真的不知道出了什么问题。

最佳答案

我不知道您是如何生成目标文件的,但您似乎正在使用 Darwin ABI,它基本上是经过大量修改的 APCS(“旧”ARM ABI)。但是,对于 linux 等,您需要使用 EABI(又名 AAPCS),它在许多情况下与 APCS 不同。

例如,R9 在 EABI 中保存调用,但在 darwin 上调用破坏,在传递 64 位值等方面存在差异。请注意,您的 clang 示例破坏了 R9,而 llvm-gcc - 没有:)

关于linux - 内核中的奇怪锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11749207/

相关文章:

c++ - 对非成员函数的 undefined reference - C++

c - C 上的数组默认是可变长度的吗?

linux - 在 linux 中设置 _IOFBF 时 stdin 如何工作

linux - Linux 中的 PATH 变量

gcc - 在 Windows 中静态链接 GTK+ 库

assembly - 实现ARM SMC的简单方法是什么

linux - arm-linux 板的 OSGi 框架

c - arm-linux-gnueabi-gcc 找不到库

linux - 如何重新加载修改后的内核模块

linux - Apache 在查询时重定向到主 URL