簡體   English   中英

C / C ++裸機編譯與特定操作系統(Linux)的編譯有什么區別?

[英]What are the differences between C/C++ bare-metal compilation and compilation for a specific OS (Linux)?

假設您有一個交叉編譯工具鏈,它為ARM體系結構生成二進制文件。

您的工具鏈是這樣的(在使用Linux的X86_64機器上運行):

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

...以及用於ARM交叉編譯的大量其他工具。

我感興趣的點是:

  • (E)二進制文件之間的ABI差異(如果有的話)
  • 在裸機的情況下的限制(如動態內存分配,在C ++的情況下使用靜態構造函數,線程模型等)
  • 兩種情況之間的二進制級別差異就每種情況而言(如調試信息支持等);
  • ABI的差異取決於你如何調用編譯器,例如GCC有-mabi ,它可以是'apcs-gnu','atpcs','aapcs','aapcs-linux'和'iwmmxt'之一。
  • 存在各種運行時功能的裸機限制,因為有人沒有提供它們。 是他們初始化零分配區域或提供C ++功能。 如果你能提供它們,它們就會起作用。
  • 二進制級別差異也取決於您如何調用編譯器。

您可以在線檢查GCC ARM選項

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM