0

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

3 回答 3

2

您希望您的编译器 (MinGW) 生成不属于您的主机系统 (Windows) 可用类型的二进制文件。这被称为交叉编译,它是一个有点复杂的主题——因为要创建完整的可执行文件,您需要各种库:标准库、目标操作系统库、第三方库……所以它不仅仅是主题“我如何让编译器创建 ELF”,还有“我如何获得 ELF 库的全部支持演员,以便我可以链接它们?”。

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

如果您想要生成Linux二进制文件,我的建议是不要打扰交叉编译(这一个棘手的主题 - 并且更好地支持相反的方式,即从 Linux 定位 Windows),而是安装 Linux 发行版与您的 Windows 并行,并在本机上使用它。

于 2018-09-11T05:41:42.687 回答
2

strip可能有帮助。 strip接受输入和输出类型(bfdname)的各种目标文件格式。 strip --info对于支持的格式。

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

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

于 2018-09-10T18:12:53.020 回答
2

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

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

也就是说,运行在 Linux 上的 GCC 可以配置为生成COFF,而运行在 Windows 上的 GCC 可以配置为为各种处理器(例如、 或、或)生成ELF32或。ELF64x86SPARCMIPS

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

TCC 仅支持 ELF 格式

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

您应该弄清楚要在哪个目标处理器和操作系统上运行最终的可执行文件,然后构建(重要)或从 Windows 下载适当的交叉编译器到该目标。

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

好的,您希望 Windows 进行Linux/i386/ELF32交叉编译。

于 2018-09-11T05:25:33.310 回答