【问题标题】:How can I make GCC generate ELF object files?如何让 GCC 生成 ELF 目标文件?
【发布时间】:2018-09-09 12:42:06
【问题描述】:

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

【问题讨论】:

  • 为什么不使用 gcc 链接可执行文件?我很确定 Windows 无论如何都无法运行 elf 可执行文件(至少,在不使用 WSL 的情况下不会)......

标签: gcc mingw elf coff tcc


【解决方案1】:

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

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

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

【讨论】:

  • strip 的这种使用是非常不寻常的(我很惊讶它的工作原理)。将一种格式转换为另一种格式的常用工具是objcopy
【解决方案2】:

然而,MinGW 中的 GCC 以 COFF 格式输出目标文件

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

也就是说,运行在 Linux 上的 GCC 可以配置为生成 COFF,而运行在 Windows 上的 GCC 可以配置为生成 ELF32ELF64,用于各种处理器(例如 x86 或 @ 987654326@,或MIPS)。

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

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 交叉编译器。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-15
      • 1970-01-01
      相关资源
      最近更新 更多