2013-10-14 43 views
4

考慮到C是一種系統編程語言,我怎樣才能將C代碼編譯爲可以在沒有操作系統的情況下調用的原始x86機器代碼? (IE:你可以假設我有一個引導扇區,它將原始機器碼從磁盤加載到內存中,然後直接跳轉到第一條指令)。如何將C代碼編譯爲一個原始的無操作系統二進制文件?

而現在,獎勵積分:理想情況下,我想使用Visual Studio 2010的編譯器,因爲我已經得到了它的編譯。否則,完成任務的最佳方式是什麼,而不必安裝大量依賴項或不得不在整個系統中進行大規模的配置更改?我會在Windows 7上編譯。

+1

編譯器不實際添加「OS具體的東西」(你應該不能算在DOS,Windows或Linux系統調用 - 這些都是在圖書館)。您應該關注的加載器由鏈接器添加。例如,着名的「您需要Windows來運行此程序」'DOS'存根可以很容易地更改爲另一個。 (每個與Windows一起成長的人都不會知道我在說什麼...)因此,請檢查您在Visual Studio中具有哪些鏈接器選項。如果沒有,則編譯爲.obj代碼並使用外部鏈接器。 – usr2564301

回答

1

通常情況下,您不需要。相反,您通常會編譯代碼,然後(使用鏈接器或其他工具)從目標文件中提取原始二進制文件。

例如,在Linux上,你可以使用objcopy工具將目標文件複製到原始的二進制文件。

$ objcopy -O binary object.elf object.binary 
1

首先你不使用需要一個系統調用的庫(printf的,FOPEN,閱讀等)。那麼你通常編譯C文件。主要區別在於鏈接器步驟,如果您習慣於讓c編譯器調用鏈接器(或者讓一些gui執行它),那麼您可能需要以某種形式手動接管它。具體的解決方案取決於你的工具,你將需要一些引導代碼(需要少量的程序集來覆蓋C編譯器和程序員的假設,並在C程序中啓動入口點)以及鏈接器腳本或鏈接器的正確的命令行選項來控制二進制的地址空間以及將對象鏈接在一起。然後,根據鏈接器的輸出格式,您可能需要將其轉換爲其他二進制格式(intel hex,srec,exe,com,coff,elf,raw binary等),以便與要加載的任何位置兼容或運行。

相關問題