2012-07-31 94 views
3

基本上,我搞亂從加載和鏈接目標代碼到Linux內核從mach對象文件,我注意到一些奇怪的東西,當我從該對象內部做一個printk。如果我用超過3個(4個或更多)參數調用printk(printk("%d,%d,%d \n", 1, 1, 1)),系統將鎖定,但稍後(不會從系統調用返回並鎖定)。 實際的打印工作並在所有情況下打印預期值。奇怪的鎖在內核

現在,奇怪的是這隻發生在我使用Clang + LLVM構建它時發生。這裏是罪魁禍首代碼:

Bad Clang

在另一方面,這是使用LLVM GCC建成,它工作得很好:

LLVM GCC

當與GNU GCC建這也適用:

GNU GCC

任何人都可以提出鐺聲版本爲什麼會使系統鎖定的原因?所以基本上,第一個代碼片段出現了問題,它使得它鎖定而不存在於其他代碼中。我真的不知道什麼是錯的。

+0

可能是在某個地方重要的事情的諷刺。在哪裏,我不知道。任何通過指令進行教學的機會? – Wug 2012-07-31 21:29:15

+0

等待,您正在從* Mach *目標文件加載代碼?說明? – duskwuff 2012-07-31 21:30:08

+0

@duskwuff長話短說,我寫了一個鏈接器,將mach對象文件鏈接並加載到linux內核中。鏈接器不是問題,其他一切正常。 – 2012-07-31 21:31:26

回答

4

我不知道你是如何生成目標文件的,但似乎你正在使用Darwin ABI,它基本上大量修改APCS(「舊」ARM ABI)。但是,對於linux等人,您需要使用EABI(又名AAPCS),這在很多情況下與APCS不同。

例如,R9在EABI中被調用保存,但在達爾文調用時,在傳遞64位值等方面存在差異。請注意,您的clang示例R9,而llvm-gcc不包含:)

+0

是的!這是'r9'問題,因爲陷阱處理程序不希望它被丟棄。我確信它在分支到處理程序代碼之前在堆棧中保存了'r9',從而解決了問題。 – 2012-08-01 08:45:15