如何通过ld将NASM程序链接到libc?

Al *_*ger 5 linux assembly nasm

我有一个针对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
Run Code Online (Sandbox Code Playgroud)

哪个是用命令组装的:

nasm -f elf libcall.asm
Run Code Online (Sandbox Code Playgroud)

如果用两行_start注释并取消注释两行main,则用命令汇编和链接:

gcc libcall.o -o libcall
Run Code Online (Sandbox Code Playgroud)

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

ld libcall.o -o libcall -lc
Run Code Online (Sandbox Code Playgroud)

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

bash: ./libcall: No such file or directory
Run Code Online (Sandbox Code Playgroud)

虽然该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>
Run Code Online (Sandbox Code Playgroud)

NASM汇编代码应如何正确地与libcvia 链接ld

Jes*_*ter 6

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

PS:你应该使用main你注释掉的入口点.

  • 谢谢!`ld libcall.o -o libcall -lc -e main -dynamic-linker/lib/ld-linux.so.2`解决了这个问题. (4认同)