嗨,我一直在尝试用汇编语言编写一个简单的 hello world 程序并将其编译为 .o 文件,然后将其与标准 C 库链接以创建一个 .exe,以便我可以在我的计算机上查看“puts”的反汇编系统使用gdb -tui
. 我正在使用带有以下实用程序版本的 Cygwin(通过 获得这些as --version && ld --version
)。我正在尝试在 Windows 8 x64 上完成所有这些工作。
作为 2.25 版
ld 版本 2.25
测试.asm
我在学习 x86 组装时在互联网上看到了几个组装标准。我想我在这里写的是GAS。
.extern puts
_start:
mov $msg, %rdi
call puts
xor %rax, %rax
ret
msg:
.ascii "hello world"
汇编器
我可以组装上面的文件没有问题,as
实用程序不会给我警告或任何错误,这是我调用as
实用程序的方式。
as test.asm -o test.o
链接器
这是我遇到麻烦的地方,以下命令是我认为我应该将目标文件与标准 c 库链接的方式。
ld test.o -o test.exe -lc
此命令会产生以下错误,这让我很困惑。我试图在其他帖子和谷歌中找到答案,但也许我错过了一些东西。
test.o:fake:(.text+0x3): relocation truncated to fit: R_X86_64_32S against `.text`
/usr/lib/libc.a(t-d000957.o):fake:(.text+0x2): undefined reference to `__imp_puts`
/usr/lib/libc.a(t-d000957.o):fake:(.text+0x2): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `__imp_puts`