3

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

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

坏叮当

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

LLVM GCC

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

GNU GCC

任何人都可以提出为什么 clang 版本会导致系统锁定的原因吗?所以基本上,第一段代码有问题,导致它被锁定,而其他代码段中不存在。我真的不知道出了什么问题。

4

1 回答 1

4

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

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

于 2012-08-01T07:36:43.077 回答