【发布时间】:2020-09-26 07:11:34
【问题描述】:
我正在尝试在 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 位程序。
我找到了解决方案:有一个带有 ld-linux-x86-64.so.2 的 /lib64 目录,您应该使用它来链接 64 位库。不过,我仍然遇到分段错误。
【问题讨论】:
-
您可以随时要求 GCC 告诉您它使用什么作为选项传递给链接器。这个答案告诉你如何:stackoverflow.com/a/1170843/3857942
标签: assembly x86-64 nasm ld glibc