gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 09:59:17 25 4
gpt4 key购买 nike

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

 $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

最佳答案

Why do I have to use the linker ld?



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

What exactly is wrong with the bin file?


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

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

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

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

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

Can I do something to make it run without ld?



当然。您可以提供所有的 ELF header 和程序 header 位,而无需任何链接程序。 Example。正确地进行操作以及在出现问题时进行调试要困难得多。

关于linux - 为什么我必须使用ld链接我的二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58646504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com