我正在尝试在 64 位 Linux 系统中使用 ld
而不是 gcc
动态链接 64 位 nasm
程序。汇编代码是这样的:
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
我正在尝试从 libc
调用 printf
和 exit
。我组装和构建:
$ 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 位程序。
我找到了解决方案:有一个/lib64 目录,其中包含 ld-linux-x86-64.so.2,您应该使用它来链接 64 位库。但我仍然遇到段错误。
最佳答案
I'm just trying to make a 64-bit program.
是的,但是您为其提供 32 位解释器,这不适用于 64 位程序。
尝试使用 /lib64/ld-linux-x86-64.so.2
代替。
修复后,程序启动,但在 printf
内崩溃并显示 SIGSEGV
。修复:
mov rdi, [rel msg]
应该是:
mov rdi, msg
关于assembly - "Accessing a corrupted shared library",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62243115/