2013-10-01 52 views
6

因此情況如下:我需要能夠從Linux機器(在Ubuntu上,它的價值)編譯二進制文件,這些文件能夠從SPARC服務器運行。我試圖編譯程序是非常簡單的:無法使用叮進行交叉編譯爲SPARC

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    printf("Testing the SPARC program..."); 
    return EXIT_SUCCESS; 
} 

我已經嘗試了多種不同的編譯線來得到它的工作,但遺憾的是沒有什麼似乎工作。

我嘗試了傳統:

clang -target sparc blah.c -o blahsparc 

但是,這並不工作,帶着一幫彙編失敗:

/tmp/blah-519e77.s: Assembler messages: 
/tmp/blah-519e77.s:7: Error: unknown pseudo-op: '.register' 
/tmp/blah-519e77.s:8: Error: unknown pseudo-op: '.register' 
/tmp/blah-519e77.s:9: Error: unknown pseudo-op: '.register' 
/tmp/blah-519e77.s:10: Error: unknown pseudo-op: '.register' 
/tmp/blah-519e77.s:11: Error: no such instruction: 'save %sp,-240,%sp' 
/tmp/blah-519e77.s:12: Error: no such instruction: 'st %g0, [%fp+2043]' 
... 
clang: error: assembler (via gcc) command failed with exit code 1 (use -v to see invocation) 

我已經試過這也:

clang -cc1 -triple "sparc-unknown-Linux" blah.c -o blahsparc 

哪些抱怨丟失的標題,所以不是使用-cc1,而是使用-Xclang:

clang -Xclang -triple -Xclang "sparc-unknown-Linux" blah.c -o blahsparc 

但是,由於「錯誤:未知目標CPU'x86-64'」,這也會失敗。 我不知道該從哪裏開始。我嘗試過使用crosstool-ng以及很少的成功。

+0

Clang的[文檔](http://clang.llvm.org/docs/UsersManual.html)表明SPARC支持不完整。 – nneonneo

+0

你看看最新的代碼並自己構建它嗎?我確定Ubuntu中的clang/llvm是svn trunk的好方法。我偶爾會看到針對sparc的LLVM提交,所以至少llvm支持應該正在改進。 – cb88

回答

4

從3.4.2發佈(2014年6月)開始,llvm缺少必要的代碼,能夠爲sparc目標生成目標文件。舊版本(1.x & 2.x)支持它,但是當時llvm發佈目標文件的框架還不成熟。當前框架推出後,看起來他們沒有遷移所有平臺。

documentation似乎意味着llvm/gcc的組合已知可以工作,但我認爲該表是基於較早版本的llvm製表的,當他們有一個不太成熟的發射目標文件的框架時。

支持用於發射目標文件添加到在修訂r198533他們的SVN主幹(this thread討論了提交),但你可以在3.4.2 final release看到,文件r198533添加&變化不存在。


順便說一下,clang目前在sparc solaris中不起作用(通常不確定sparc)。解析器似乎無法解析模板;我得到了coredumps &之類的東西。我在大約一週前跑過thread,討論了sparc/solaris clang中的對齊問題,這可能是clang在這個平臺上尚未使用的原因之一。

+1

由於對齊錯誤,Debian具有相同的問題。 – rsaxvc

+0

Clang現在可以在Sparc64上運行..你應該更新這篇文章。但它仍然使用binutils中的鏈接器和彙編器,而不是內置的。 – cb88

+0

@ cb88我會盡快建立它,然後用我的結果編輯我的答案。 –

3

如果你需要一個在Ubuntu機器上運行的Sparc的交叉編譯器,我知道的最簡單的方法就是使用Buildroot。 Here's a small tutorial關於如何獲取交叉編譯器並測試Sparc仿真器上生成的可執行文件。

3

LLVM 3.6.2現在對sparc有一些支持......我可以在我的T2000上構建llvm 3.6.2和clang 3.6.2-r100。我還沒有得到C++支持的工作,但我已經構建了適度複雜的C應用程序,如htop。

我沒有使用gcc 5.2編譯LLVM,但是我的低版本應該也能工作,儘管我建議至少使用gcc 4.9並且不低於gcc 4.7。

的LLVM出現在Gentoo在編譯過程中墜毀,但我可以通過移動與LLVM的ebuilds Portage的目錄並手動重新啓動建設,以恢復它:

cd /usr/portage/*/llvm/ 
ebuild llvm-3.6.2.ebuild merge 

我不得不重寫一些默認的編譯器:

CC="clang -target sparc-unknown-linux-gnu" 
CXX="clang++ -target sparc-unknown-linux-gnu" 
CFLAGS="-O2 -pipe" 
CXXFLAGS="${CFLAGS}" 

我不知道,你將能夠使用這個從x86機器建立...雖然鐺應該是能夠做到這一點。但最壞的情況下,你可能可以在qemu-system-sparc64虛擬機上或者在ebay上可以找到便宜的某些真實硬件(T5xxx硬件價格下降並且刀片很便宜)進行此操作。

我最近更新到叮噹3.8(這是尚未發佈),我能夠通過除上述選項之外傳遞-lstdC++來編譯C++應用程序。我認爲這與gcc調用gcc而不是g ++時的行爲相同。