【问题标题】:"Accessing a corrupted shared library"“访问损坏的共享库”
【发布时间】: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 呼叫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 位程序。


我找到了解决方案:有一个带有 ld-linux-x86-64.so.2 的 /lib64 目录,您应该使用它来链接 64 位库。不过,我仍然遇到分段错误。

【问题讨论】:

标签: assembly x86-64 nasm ld glibc


【解决方案1】:

我只是想制作一个 64 位程序。

是的,但您正在为其提供 32 位解释器,这不适用于 64 位程序。

尝试改用/lib64/ld-linux-x86-64.so.2

修复后,程序启动,但在SIGSEGV 内出现SIGSEGV 崩溃printf。修复:

mov rdi, [rel msg]

应该是:

mov rdi, msg

【讨论】:

  • 我认为他会选择 lea rdi, [rel msg] 这也是首选的 PIC 方法
猜你喜欢
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多