我试图在64位Linux系统中使用ld而不是gcc来动态链接64位的Linux程序。程序集代码如下:
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位的程序。
我找到了解决方案:有一个带有d-Linux86-64.so.2的/lib64目录,您应该使用它来链接64位库。不过,我还是有个分割错误。
发布于 2020-06-08 02:54:33
,我只是想做一个64位的程序.
是的,但是你为它提供了32位的解释器,这对于64位程序来说是行不通的。
尝试使用/lib64/ld-linux-x86-64.so.2代替。
修复之后,程序就会启动,但是SIGSEGV会在printf中崩溃。修正:
mov rdi, [rel msg]应:
mov rdi, msghttps://stackoverflow.com/questions/62243115
复制相似问题