基本上,我在忙于从 mach 目标文件加载目标代码并将其链接到 Linux 内核,并且当我从该对象内部执行 printk
时,我注意到了一些奇怪的事情。如果我用超过 3 个(4 个或更多)参数调用 printk (printk("%d,%d,%d\n", 1, 1, 1)
),系统将锁定,但在稍后的某个时间点(它不会从系统调用返回而只是锁定)。 在所有情况下,实际打印都有效并打印出预期值。
现在,奇怪的是只有在我使用 Clang+LLVM 构建它时才会发生这种情况。这是罪魁祸首代码:
另一方面,当它是使用 LLVM 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/