【问题标题】:Why do I have to use ld to link my binary为什么我必须使用 ld 来链接我的二进制文件
【发布时间】:2020-02-26 23:59:38
【问题描述】:

我正在 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 -o test test.o -m elf_x86_64 时,这会从test.o 创建一个ELF 可执行文件,并将其输出为一个名为test 的ELF 可执行文件。要运行它,请使用 ./test 。您也不会将 bin 文件作为 ELF 可执行文件运行。你想做什么?
  • nasm -f bin ./test.nasm -o test.bin 怎么样?当然,如果我告诉 NASM 给我二进制文件,它必须给我一个二进制文件?
  • 它会生成一个二进制文件,但 Linux 的加载器不运行 bin 文件。它将运行 ELF 可执行文件。除非您的 bin 文件碰巧被设计为看起来像 ELF 可执行文件,否则它不会运行。链接器获取目标文件并生成可由 Linux 加载程序加载的可执行文件。

标签: linux nasm elf


【解决方案1】:

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

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

bin 文件到底有什么问题?

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

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

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

但您并没有尝试这样做——您使用的是 Linux,需要告诉它在哪里加载程序以及如何启动它。

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

我可以做一些事情让它在没有 ld 的情况下运行吗?

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

【讨论】:

  • 清晰、简洁、准确地填补了我的知识空白!感谢受雇的俄罗斯人!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多