为什么必须使用ld链接我的二进制文件

时间:2019-10-31 15:19:06

标签: linux nasm elf

我正在NASM中做一些“ Hello World”程序,以便在我的Ubuntu机器上运行(uname-以下包含输出):

 $uname -a
Linux desk069 4.15.0-66-generic #75-Ubuntu SMP Tue Oct 1 05:24:09 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

现在将其保存到文件后,我必须运行

nasm -f elf64 ./test. ./test.nasm -o test.o
ld -o test test.o -m elf_x86_64

为了使我的代码正常工作。尝试运行test.o会给我

bash: ./test.o: cannot execute binary file: Exec format error

并尝试使NASM生成bin文件给我:

$nasm -f bin ./test.nasm -o test.bin
$chmod +x ./test.bin
$./test.bin
bash: ./test.bin: cannot execute binary file: Exec format error

我的问题是,我没有使用任何库。为什么必须使用链接器ld? bin文件到底有什么问题?我可以做些什么使它在没有ld的情况下运行吗?

我的代码包含在下面。

section .text
    global _start

section .data
msg db 'Hello, world!', 0xa 
len equ $- msg 

section .text

_start:

    mov edx, len 
    mov ecx, msg 
    mov ebx, 1
    mov eax, 4
    int 0x80

    mov ebx, 0
    mov eax, 1
    int 0x80

1 个答案:

答案 0 :(得分:2)

  

为什么必须使用链接器ld?

您不必使用ld,但使用起来要容易得多(见下文)。

  

bin文件到底有什么问题?

.bin文件中的所有内容都没有告诉操作系统如何加载和运行它。

操作系统应将此文件映射到什么地址?应该在哪里设置RIP寄存器以开始执行它?

创建在“裸机”系统上运行的程序时,可以安排将该程序确切地加载到处理器重置地址,并且处理器将在该地址处开始获取并执行指令。通电。

但是您并没有尝试这样做-您正在使用Linux,并且需要告知它在何处加载程序以及如何启动它。

尽管Linux也可以执行其他文件格式,但是通常由ELF文件头和程序头(链接程序准备)提供此信息。

  

我可以做些什么使它在没有ld的情况下运行吗?

好的。您可以提供所有ELF标头和程序标头位,而无需,它们完全不包含链接程序。 Example。正确地执行操作以及在出现问题时进行调试要困难得多。