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