我对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,但失败了,我在下面找到了两个最相关的链接,但没有回答我的问题:
Building a 32-bit app in 64-bit Ubuntu
任何帮助将不胜感激。感谢...
答案 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。