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

时间:2016-02-08 16:01:37

标签: 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

使用命令组装:

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>

如何通过libc将NASM汇编代码与ld正确关联?

1 个答案:

答案 0 :(得分:6)

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

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