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

雪松

我正在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
受雇于俄罗斯

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

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

bin文件到底有什么问题?

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

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

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

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

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

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

当然。您可以提供所有ELF头文件和程序头文件的位,根本涉及链接器。实例正确地进行操作以及在出现问题时进行调试要困难得多。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我的补丁以二进制格式发布?

为什么git认为我的.sql文件是二进制文件?

为什么我不能将二进制文件的输出重定向到文件?

为什么我的文本文件比二进制文件大?

为什么我的系统只在 /snap 中查找二进制文件?

为什么编译后我们不能理解二进制文件的内容?

为什么我会执行二进制文件错误?

为什么我不能从/ home路径运行二进制文件

为什么我编译的 C++ 二进制文件不能执行?

ld链接时巨大的二进制文件大小

通过 docker 使用 postgres 时,我应该为什么设置二进制路径?

为什么我使用 curl 获得二进制输出

如何使用gcc / ld将目标文件链接到原始二进制文件?

我编译器生成的二进制文件不仅仅包含二进制数,为什么?

为什么 crontab 成功运行了我的 shell 脚本,但无法启动我的二进制文件程序?

为什么链接的二进制文件包含已使用的目标文件的文件名,如何将其删除?

为什么安装二进制文件后需要设置LD_LIBRARY_PATH?

为什么ld的输出二进制文件无法执行?

动态链接尝试全部产生静态链接的二进制文件?为什么?

我自己的二进制文件处于调试模式“二进制文件未使用调试信息构建”

为什么Linux上的Subversion客户端将我的XML文件检测为二进制文件?

Cmake - 我必须运行 cmake --build 。两次构建二进制文件

我不明白为什么我的二进制搜索代码显示分段错误

如何强制golang将文件链接到我的二进制文件中?

为什么“二进制文件”不在原始二进制文件中?

如何将库链接到我的C代码并在Rust二进制文件中使用它?

为什么我的交叉编译CGO二进制文件不能在Raspberry Pi(Raspbian)上运行?

不明白为什么我不能在tclsh中执行命令行二进制文件

为什么我的二进制文件可以在Windows 8上运行而不能在Windows 7上运行?