【发布时间】:2012-07-31 21:22:52
【问题描述】:
基本上,我在将目标代码从 mach 目标文件加载和链接到 Linux 内核时搞砸了,当我从该对象内部执行 printk 时,我注意到了一些奇怪的事情。如果我使用超过 3 个(4 个或更多)参数 (printk("%d,%d,%d \n", 1, 1, 1)) 调用 printk,系统将锁定,但稍后会锁定(它不会从系统调用返回,而是锁定)。 实际打印工作并在所有情况下打印预期值。
现在,奇怪的是只有在我使用 Clang+LLVM 构建它时才会发生这种情况。这是罪魁祸首代码:
另一方面,当它使用 LLVM GCC 构建时,它工作得很好:
这也适用于使用 GNU GCC 构建时:
谁能说明为什么clang版本会导致系统锁定?所以基本上,第一个sn-p代码有问题导致系统锁定,而不是存在于其他人身上。我真的不知道怎么了。
【问题讨论】:
-
可能在某处乱写一些重要的东西。具体在哪里,我不知道。是否有机会逐条说明?
-
等等,你正在从 Mach 目标文件中加载代码?解释一下?
-
@duskwuff 长话短说,我写了一个链接器来链接和加载 mach 目标文件到 linux 内核。链接器不是问题,其他一切正常。
-
哇。好。您确定您的 Mach 对象使用与 Linux 内核相同的调用约定吗?
-
@duskwuff 不完全确定。但我认为 EABI 和 Darwin ABI 非常相似。我对 EABI 做了些微改动,现在为了兼容性,大型类型以 4 字节对齐。