我需要使用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配置为针对各种处理器(例如ELF32
或ELF64
或x86
)生成SPARC
或MIPS
。
在一种主机上运行但是为不同类型生成代码的编译器称为交叉编译器。
TCC仅支持ELF格式
这不是一个有意义的陈述:它可能意味着您希望GCC生成ELF32 for i686 Linux
或ELF64 for SPARC Solaris
,或任何数量的其他处理器/ os / bit组合。
您应该弄清楚要运行最终可执行文件的目标处理器和操作系统,然后构建(非平凡)或从Windows下载适当的交叉编译器到该目标。
file test.o
test.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
好的,你想要Windows到Linux/i386/ELF32
交叉编译器。
您希望编译器(MinGW)生成不属于主机系统类型的二进制文件(Windows)。这称为交叉编译,它是一个有点参与的主题 - 因为要创建完整的可执行文件,您还需要各种库:标准库,目标OS库,第三方库......所以它不仅仅是主题“如何让编译器创建ELF”,以及“如何获得ELF库的整个支持演员,以便我可以链接它们?”。
OSDev有关于建立交叉编译器主题的大量文档;但是,由于您没有告诉我们您的问题究竟是什么,因此很难再向您提出建议。
如果您想要生成Linux二进制文件,我的建议是不要打扰交叉编译(这是一个棘手的主题 - 并且更好地支持反过来,即targeting Windows from Linux),而是并行安装Linux发行版你的Windows,并与之一起本地工作。