"Accessing a corrupted shared library"

"Accessing a corrupted shared library"

我正在尝试使用 ld 而不是 gcc 在 64 位 Linux 中动态 link 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 呼叫 printfexit。我 assemble 并构建:

$ 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

有一个类似问题的问题,但那里的问题恰恰相反:他们试图在 64 位机器上创建 32 位程序。我只是想制作一个 64 位程序。


我找到了解决方案:有一个带有 ld-linux-x86-64.so.2 的 /lib64 目录,您应该将其用于 link 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