2014-04-11 49 views
6

假設您有一個爲ARM體系結構生成二進制文件的交叉編譯工具鏈。特定操作系統(Linux)的C/C++裸機編譯和編譯有什麼區別?

你的工具鏈是這樣的(與Linux上X86_64機器上運行):

  • ARM-Linux的gnueabi-gcc.exe:爲交叉編譯的Linux,ARM上運行。
  • arm-gcc.exe:針對ARM的裸機交叉編譯。

......以及其他許多ARM上交叉編譯工具。

點即我感興趣的是:

  • 二進制之間(E)ABI差異(如果有的話)在裸金屬的情況下
  • 限制(如動態存儲器分配,靜態構造的使用在C++的情況下,線程模型等)
  • 2個案例之間的二進制級別的差異,特定於每個信息(如調試信息支持等);
+0

這聽起來像「我的小程序和我的操作系統之間的差異」... – deviantfan

+0

@deviantfan:聽起來更像「我可以使用我習慣用於固件的C/C++的所有」常規「功能裸機)發展?「 閱讀這篇文章後:http://www.state-machine.com/arm/Building_bare-metal_ARM_with_GNU.pdf我注意到裸金屬C/C++的一些限制。是否還有更多(和差異)? :) – Liviu

+1

對於*真正裸機*,您需要爲* newlib *編寫可移植層。在Gnu Linux上,* eglibc *或[* glibc *](http://en.wikipedia。org/wiki/GNU_C_Library)。基本上,你的問題是什麼區別。有1000多個。你想使用'mmap()'?等二進制/編譯器差異並不重要(大部分)。這是'C'庫完全不同。文件I/O? –

回答

3
  • ABI的差異是由你如何調用編譯器,例如GCC有-mabi,並且可以 'APCS-GNU', 'ATPCS', 'AAPCS','AAPCS-Linux的之一, 'iwmmxt'。
  • 對於各種運行時功能的裸機限制存在,因爲有人沒有提供它們。是他們初始化零分配區域還是提供C++功能。如果你可以提供他們,他們會工作。
  • 二進制級別的差異也取決於你如何調用編譯器。

您可以檢查GCC ARM options online

1

我最近開始一個小項目,在裸機環境中使用Linux標準C庫。我一直在我的博客上描述它:http://ellcc.org/blog/?page_id=289 基本上我所做的是設置一種處理Linux系統調用的方式,以便通過實現特定系統調用的簡化版本,我可以使用標準庫中的函數。例如,ARM的當前狀態實現了read(),readv(),write(),writev()和brk()的簡化版本。這使我可以不改變地使用printf(),fgets()和malloc()。

我是我的情況,我使用相同的編譯器來定位Linux和裸機。由於它是基於clang/LLVM的,我也可以使用相同的編譯器來定位其他處理器。我現在正在爲Mips開發一個裸機示例。

所以我想答案是沒有任何區別。

相關問題