2010-03-13 48 views
11

我最近遇到了一些問題,試圖在我的Mac上編譯一個依賴於另一個庫的開源庫,並得到了有關不兼容庫體系結構的一些錯誤。有人可以解釋爲特定架構編譯C程序的概念嗎?我已經看到-arch編譯器標誌之前,並看到傳遞給它的值,如ppc,i386x86_64,我假設它映射到CPU「語言」,但我的理解停在那裏。如果一個程序使用特定的體系結構,那麼它加載的所有庫都需要在同一個體系結構中?我怎麼知道給定的程序/進程正在運行的架構?編譯具有特定體系結構的C程序

回答

13

有人可以解釋爲特定架構編譯C程序背後的概念嗎?

是的。這個想法是將C翻譯成一系列本地機器指令,將程序編碼爲二進制形式。這裏的「體系結構」的含義是「指令集體系結構」,指令是如何以二進制編碼的。例如,每個體系結構都有自己的編碼方式,用於添加兩個整數的指令。

編譯成機器指令的原因是它們運行非常快。

如果一個程序使用特定的體系結構,那麼它加載的所有庫都需要在同一個體系結構中?

是的。 (有例外,但很少見。)

如何判斷給定程序/進程正在運行的架構?

如果一個進程在你的硬件上運行,它是在原生架構,在Unix上,你可以通過運行命令uname -m發現運行,雖然人類從讀者的uname -a輸出可能會提供更多的信息。

如果你有一個可執行的二進制或一個共享庫(.so文件),則可以使用file命令發現它的架構:

% file /lib/libm-2.10.2.so 
/lib/libm-2.10.2.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped 
% file /bin/ls 
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped 

你可以看到,這些二進制文件已編爲很老80386架構,儘管我的硬件是更現代的i686。 i686(Pentium Pro)向後兼容80386並運行80386二進制文件以及本機二進制文件。爲了使這種向後兼容成爲可能,英特爾遇到了很多麻煩和費用—,但他們幾乎在臺式機CPU上佔據了市場,所以這是值得的!

1

要爲CPU構建與本機不同的體系結構,您需要一個交叉編譯器,這意味着生成的代碼無法在您所坐的計算機上本機運行。 GCC可以做到這一點。找出構建程序的體系結構以查看文件命令。至少在基於Linux的系統中,一個32位x86程序需要32位x86庫來支持它。我想大多數操作系統都是一樣的。

3

這裏可能會引起混淆的一件事是,Mac平臺有他們所說的universal binary,這是一個存檔中的兩個二進制文件,一個用於intel,另一個用於ppc體系結構。您的電腦將自動決定運行哪一個。您可以(有時)在仿真模式下運行另一個架構的二進制文件,並且某些架構是其他架構的超集(即i386代碼通常運行在i486,i586,i686等),但大多數情況下只有代碼你可以運行你的處理器架構的代碼。

對於交叉編譯,不僅是程序,而且它使用的所有庫都需要與目標處理器兼容。有時這意味着安裝了第二個編譯器,有時候這只是爲編譯器提供了正確的額外模塊的問題。交叉編譯器爲gcc is actually a seperate executable, though it can sometimes be accessed via a command line switch。各種體系結構的gcc交叉編譯器很可能是單獨安裝。

1

ldd在這種情況下有幫助嗎?

相關問題