【问题标题】:How does one link NASM program to libc via ld?如何通过 ld 将 NASM 程序链接到 libc?
【发布时间】:2016-05-18 08:50:56
【问题描述】:

我有一个适用于 NASM (ArchLinux i686) 的以下程序

SECTION .data
LC1: db "library call", 0

SECTION .text
extern exit
extern printf

;global main
;main:
global _start
_start:
push    LC1
call    printf

push    0
call    exit

用命令组装:

nasm -f elf libcall.asm

如果用_start注释两行并用main取消注释两行,然后用命令组装和链接:

gcc libcall.o -o libcall

然后程序运行正常。但是如果用_start入口点组装代码并用命令链接:

ld libcall.o -o libcall -lc

然后在 bash 中启动程序后(通过命令./libcall)返回以下错误消息:

bash: ./libcall: No such file or directory

虽然libcall 文件确实存在。 objdump 显示如下:

[al libcall ]$ objdump -d libcall

libcall:     file format elf32-i386


Disassembly of section .plt:

08048190 <printf@plt-0x10>:
 8048190:   ff 35 78 92 04 08       pushl  0x8049278
 8048196:   ff 25 7c 92 04 08       jmp    *0x804927c
 804819c:   00 00                   add    %al,(%eax)
    ...

080481a0 <printf@plt>:
 80481a0:   ff 25 80 92 04 08       jmp    *0x8049280
 80481a6:   68 00 00 00 00          push   $0x0
 80481ab:   e9 e0 ff ff ff          jmp    8048190 <printf@plt-0x10>

080481b0 <exit@plt>:
 80481b0:   ff 25 84 92 04 08       jmp    *0x8049284
 80481b6:   68 08 00 00 00          push   $0x8
 80481bb:   e9 d0 ff ff ff          jmp    8048190 <printf@plt-0x10>

Disassembly of section .text:

080481c0 <_start>:
 80481c0:   68 88 92 04 08          push   $0x8049288
 80481c5:   e8 d6 ff ff ff          call   80481a0 <printf@plt>
 80481ca:   6a 00                   push   $0x0
 80481cc:   e8 df ff ff ff          call   80481b0 <exit@plt>

NASM 汇编代码应如何通过ld 正确链接到libc

【问题讨论】:

  • 您是否尝试过明确定义入口点?类似ld -o libcall -e _start libcall.o -lc
  • @Kamiccolo 我刚试过,但没有任何区别。

标签: linux assembly nasm


【解决方案1】:

libc/crt 的某些部分包含在您还需要链接的目标文件中。此外,您需要指定一些选项,例如要使用的动态加载程序(又名解释器)(这可能是您的问题的原因。)只需使用 gcc 为您做正确的事情。如果您有兴趣,可以使用gcc -v 运行,然后您会看到它用于链接的可怕命令行。您已被警告;)

PS:你应该使用你已经注释掉的main入口点。

【讨论】:

  • 谢谢! ld libcall.o -o libcall -lc -e main -dynamic-linker /lib/ld-linux.so.2 解决了这个问题。
猜你喜欢
  • 2018-01-22
  • 2011-01-15
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 2013-03-14
  • 2012-07-20
  • 1970-01-01
  • 2019-03-20
相关资源
最近更新 更多