如何使GCC生成ELF对象文件?

时间:2018-09-09 12:42:07

标签: gcc mingw elf coff tcc

我需要使用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

3 个答案:

答案 0 :(得分:1)

strip可能会有所帮助。 strip接受各种对象文件格式作为输入和输出类型(bfdname)。 strip --info获取支持的格式。

strip -o outputname -O elf32-i386 objfile在64位可执行文件上执行此操作,将其转换为32位控制标头将导致崩溃,因此,请谨慎选择输出格式。确保您未更改标头的假定位宽/字节序。

未运行MinGW,因此,未经测试,可能无法满足您的需求,或更糟糕的是,可能会跳起来着火。

答案 1 :(得分:1)

  

但是,MinGW中的GCC以COFF格式输出目标文件

可以配置GCC 以生成各种输出(包括ELF),无论它们运行在哪个主机上。

也就是说,对于各种处理器(例如,在Linux上运行的GCC可以配置为生成COFF,在Windows上运行的GCC可以配置为生成ELF32ELF64x86SPARCMIPS)。

在一种主机上运行但为另一种主机生成代码的编译器称为交叉编译器。

  

TCC仅支持ELF格式

这不是一个有意义的声明:这可能意味着您希望GCC生成ELF32 for i686 LinuxELF64 for SPARC Solaris或任意数量的其他处理器/操作系统/位组合。

您应该找出要在其上运行最终可执行文件的 target 处理器和操作系统,然后进行构建(非常简单)或从Windows将适当的交叉编译器下载到该目标。 / p>

  

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

好吧,您希望Windows Linux/i386/ELF32交叉编译。

答案 2 :(得分:1)

您希望编译器(MinGW)生成的二进制文件不适用于您的主机系统(Windows)。这称为 cross-compiling (交叉编译),并且涉及到一些问题-因为要创建完整的可执行文件,您还 需要各种库:标准库,目标OS库,第三方库...因此,它不仅是“如何使编译器创建ELF的主题”,而且还不仅是“如何获取ELF库的全部支持列表,以便可以与之链接?”的主题。

OSDev关于设置交叉编译器的文档非常丰富;但是,由于您没有告诉我们您的问题到底是什么,因此很难进一步建议您。

如果您要生成的是 Linux 二进制文件,我的建议是不要打扰交叉编译(一个棘手的主题,并且更好地支持其他方法,例如targeting Windows from Linux),而是与Windows并行安装Linux发行版,并以此为基础进行本机工作。