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

我有一个针对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>

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

解决方法:

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

上一篇:linux – 在x86中将字符串定义为字节(db)和将字符串定义为单词/双字(dw / dd)之间的区别是什么


下一篇:assembly x86(nasm)画三角形等图形的实现