簡體   English   中英

如何讓 GCC 生成 ELF 目標文件?

[英]How can I make GCC generate ELF object files?

我需要使用 TCC 編譯器來鏈接 GCC 生成的目標文件。 但是,MinGW 中的 GCC 以 COFF 格式輸出目標文件,而 TCC 僅支持 ELF 格式。 如何讓 GCC 生成 ELF 目標文件?

$ cat test.c
int main(void)
{
        return 0;
}
$ gcc -c test.c
$ file test.o
test.o: MS Windows COFF Intel 80386 object file
$ tcc -c test.c
$ file test.o
test.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

strip可能會有所幫助。 strip接受輸入和輸出類型(bfdname)的各種目標文件格式。 strip --info支持的格式。

strip -o outputname -O elf32-i386 objfile在 64 位可執行文件上執行此操作,轉換為 32 位控制標頭只會導致崩潰,因此請謹慎選擇輸出格式。 確保您沒有隨標題一起更改假定的位寬/字節序。

不運行 MinGW,因此,未經測試,可能無法滿足您的需求,或者更糟糕的是,可能會跳起並着火。

但是,MinGW中的GCC以COFF格式輸出目標文件

GCC 可以配置為生成各種輸出(包括ELF ),而不管它在哪個主機上運行。

也就是說,Linux 上運行的 GCC 可以配置為生成COFF ,Windows 上運行的 GCC 可以配置為生成ELF32ELF64 ,適用於各種處理器(例如x86SPARCMIPS )。

在一種主機上運行但為不同類型生成代碼的編譯器稱為交叉編譯器。

TCC 只支持 ELF 格式

這不是一個有意義的聲明:它可能意味着您希望 GCC ELF32 for i686 Linux生成ELF32 for i686 Linux ,或ELF64 for SPARC Solaris生成ELF32 for i686 Linux ,或任何數量的其他處理器/操作系統/位組合。

您應該弄清楚要在哪個目標處理器和操作系統上運行最終可執行文件,然后從 Windows 構建(非平凡)或下載適當的交叉編譯器到該目標。

file test.o
test.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

好的,你想要 Windows 到Linux/i386/ELF32交叉編譯器。

您希望您的編譯器 (MinGW) 生成不適用於您的主機系統 (Windows) 的類型的二進制文件。 這稱為交叉編譯,它是一個有點復雜的主題——因為要創建完整的可執行文件,您需要各種庫:標准庫、目標操作系統庫、第三方庫……所以它不僅僅是主題“我如何讓編譯器創建 ELF”,還有“我如何獲得 ELF 庫的整個支持陣容,以便我可以鏈接到它們?”。

OSDev有關於設置交叉編譯器的大量文檔; 但是,由於您沒有告訴我們您的問題究竟是什么,因此很難為您提供進一步的建議。

如果您想要的是生成Linux二進制文件,我的建議是不要打擾交叉編譯(這一個棘手的主題 - 並且更好地支持相反的方式,即從 Linux 面向 Windows ),而是安裝 Linux 發行版與您的 Windows 並行,並在本地使用它。

暫無
暫無

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

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