什么用于“--oformat = elf32-i386”?

时间:2014-10-21 15:59:48

标签: c assembly linker gnu

我对GNU链接器的两个命令行选项--- ld感到困惑。但在我提出问题之前,我会告诉你一些背景知识。

这些天我正在阅读Richard Blum的专业汇编语言cpuid.s是本书汇编代码的示例。本书介绍了32位汇编编程,但我的是64位操作系统。

为了生成32位输出,只要符合本书的样本。我使用以下两个命令来汇编和链接代码:

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

然而,在第二步,ld失败,“输入文件`cpuid2.o'的ld:i386架构与i386:x86-64输出不兼容”。

在谷歌之后,我发现我需要使用-melf_i386选项:

ld -melf_i386 -o cpuid cpuid.o

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

  

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

我使用32位目标文件cpuid.o,并告诉ld通过--oformat=elf32-i386 optoin显式生成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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

as --32

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

ld --oformat=elf32-i386

意味着你要求ld将ec文件格式设置为32位ilf86平台的elf,而-melf_i386则要求链接器生成/模拟i386机器的目标文件。 所以--oformat要求链接器根据目标arch生成对象,而-m要求链接器模拟目标arch。