我正在尝试在64位Linux系统中使用nasm
而不是ld
动态链接64位gcc
程序。汇编代码是这样的:
extern printf
extern exit
section .data
msg: db "Hello x%d", 10, 0
section .text
global _start
_start:
mov rdi, [rel msg]
mov rsi, 64
call printf
mov rdi, 0
call exit
我正在尝试从printf
调用exit
和libc
。我组装并构建:
$ nasm -felf64 src/printf.asm -o bin/printf.o
$ ld bin/printf.o -lc -I /lib/ld-linux.so.2 -o bin/printf
然后我跑步并出现错误:
$ bin/printf
bash: bin/printf: Accessing a corrupted shared library
存在与here类似的问题,但问题恰恰相反:他们试图在64位计算机上创建32位程序。我只是想制作一个64位程序。
我找到了解决方案:存在一个带有ld-linux-x86-64.so.2的/ lib64目录,您应该使用该目录链接64位库。我仍然遇到细分错误。
我只是想制作一个64位程序。
是的,但是您正在为其提供32位解释器,该解释器不适用于64位程序。
尝试改用/lib64/ld-linux-x86-64.so.2
。
修复后,程序启动,但是在SIGSEGV
内出现printf
时崩溃。修复:
mov rdi, [rel msg]
应该是:
mov rdi, msg