assembly - "Accessing a corrupted shared library"

标签 assembly x86-64 nasm ld glibc

我正在尝试在 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 调用 printfexit。我组装和构建:

$ 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/

相关文章:

python - 运行 32 位编译二进制文件的进程是否可以使用超过 4GB 的内存?

visual-studio - 如何在 Visual Studio 2017/2019 中构建 x64 汇编项目

linux - 如何在汇编程序中打开文件并修改它?

c - 访问整数最低有效位的最快方法?

c++ - 为什么编译器只为 int 保留 0x10 位?

windows - "66:PUSH 08"中的66代表什么?

windows - 为什么Windows在新的x64进程中使用RCX、RDX作为指针,与新创建的32位进程中的EAX、EBX不同?

c - 如何使用 Nasm 汇编器使用 C-printf() 仅打印一定数量的字节?

NASM局部标签区分

在 qemu 中使用 gdb 调试引导加载程序