【问题标题】:What the usage of "--oformat=elf32-i386"?“--oformat=elf32-i386”有什么用?
【发布时间】:2014-12-16 22:28:56
【问题描述】:

我对 GNU 链接器的两个命令行选项 --- ld 感到有些困惑。但在我提出问题之前,我将向您展示一些背景。

我最近正在阅读 Richard Blum 的Professional Assembly Language,cpuid.s 是本书中的汇编代码示例。这本书介绍的是 32 位汇编编程,但我的是 64 位操作系统。

为了生成 32 位的输出,只要符合书中的示例即可。我使用以下两个命令来组装和链接代码:

as --32 -o cpuid.o cpuid.s
ld --oformat=elf32-i386 -o cpuid cpuid.o

但是,在第二步中,ld 失败并显示“ld: i386 architecture of input file `cpuid2.o' is incompatible with i386:x86-64 output”。

google了一下,发现需要使用-melf_i386选项:

ld -melf_i386 -o cpuid cpuid.o

是的,这次链接成功了,但是不知道为什么,在GNU的官方文档中,是这样写的:

您可以使用 `--oformat' 选项来指定输出对象的二进制格式

我使用一个32位的目标文件cpuid.o,并通过--oformat=elf32-i386 optoin告诉ld显式生成32位输出,我想应该没问题。但是为什么我必须使用-melf_i386 选项?那么--oformat存在的原因是什么?

我试图用谷歌搜索 anwser,但失败了,我在下面找到了两个最相关的链接,但没有回答我的问题:

http://www.linuxquestions.org/questions/linux-software-2/relocatable-linking-on-x86-64-for-i386-872812/

Building a 32-bit app in 64-bit Ubuntu

任何帮助将不胜感激。谢谢...

【问题讨论】:

    标签: c assembly linker gnu


    【解决方案1】:

    输出格式不一定对应于架构,即使 elf32-i386 可能是这种情况。但对于 ihex 或 bin 等其他人来说,ld 无法选择合适的架构仿真。这就是为什么它只是默认为它已经编译的那个,在你的情况下似乎是 x86-64。

    【讨论】:

      【解决方案2】:
      as --32
      

      表示您的目标是 32 位拱形机器,但是

      ld --oformat=elf32-i386
      

      表示您要求 ld 将 exe 文件格式制作为 i386 平台的 32 位 elf,而 -melf_i386 要求链接器为 i386 机器生成/模拟目标文件。 所以 --oformat 要求链接器根据目标拱门生成对象,而 -m 要求链接器模拟目标拱门。

      【讨论】:

        猜你喜欢
        • 2015-08-09
        • 1970-01-01
        • 2011-04-17
        • 2010-12-17
        • 1970-01-01
        • 2012-05-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多