2011-11-28 482 views
7

如何在x86架構上使用gcc生成a.out文件格式?使用gcc生成a.out文件格式

隨着NASM我可以用-f標誌很容易地做到這一點,例如:

[[email protected]]$ nasm -f aout start.asm 
[[email protected]]$ objdump -a start.o 

start.o:  file format a.out-i386-linux 
start.o 

[[email protected]]$ 

在Linux,編譯.c文件生成一個ELF對象。我如何使用gcc生成a.out文件?

+0

您正在使用哪個系統?我不認爲Linux支持a.out可執行文件了。我不知道中間目標文件。 –

+0

我相信內核可以配置a.out支持,但默認關閉。自從我編譯一個內核以來已經有一段時間了,可能不再是這種情況。 – goldfire

+0

如果在編譯時啓用了CONFIG_BINFMT_AOUT,Linux確實會支持它。 –

回答

11

要使用gcc生成a.out格式,需要告訴您的鏈接器要這樣做。您可以通過從gcc傳遞標誌來完成此操作,這要歸功於-Wl標誌。

這裏是你的a.out格式做什麼:

gcc -Wl,--oformat=a.out-i386-linux file.c -o file.out 

您還可以顯示支持的所有格式鍵入:

objdump -i 
+0

問題是,我有許多elf格式的目標文件(.o),所以當我在鏈接器腳本中將它們與OUTPUT_FORMAT(a.out-i386-linux) 參數鏈接時,我得到以下錯誤:「can not以a.out目標文件格式表示「.comment」部分「。這就是爲什麼我需要將「gcc -c file.c」從頭開始編譯爲a.out格式,而不是ELF。 – Nulik

+0

我發現上面的解決方案,使用-fno-ident選項.comment節沒有生成,我用grub啓動了我的a.out內核。謝謝 – Nulik

+0

對不起,我錯過了您的第一條評論,並很高興您發現修復自己:) –

0

這個問題有兩個答案。一個是你需要編譯一個新的GCC,並把它作爲目標;它不像翻轉命令行開關那麼簡單。另一個答案是一個問題:爲什麼你真的需要這個?我不能馬上想到一個有效的理由。

+1

我正在開發一個操作系統,我需要將內核和應用程序一起打包到一個圖像文件中,以便快速加載一次讀取和一次寫入(整個圖像),a.out看起來是理想的格式,很簡單,並由很多引導程序支持。 – Nulik