怎么把ELF文件转换成二进制文件?

sni*_*per 5 elf

我的理解是,二进制文件是处理器指令的十六进制代码(可以加载到内存中并从入口点开始执行),而ELF文件与为数据等分配的未固定内存地址相同。 。

现在,如何将ELF转换为二进制文件?

转换如何进行?我的意思是内存地址是如何分配的?

ysd*_*sdx 5

一般来说

ELF文件不需要使用“ NO固定的内存地址”。实际上,典型的ELF可执行文件(ET_EXEC)使用的是固定地址。

二进制文件通常被理解为包含非文本数据的文件。在程序的上下文中,通常将其理解为程序的编译形式(与通常是一堆文本文件的源形式相反)。ELF文件是二进制文件。

现在,您可能想知道ELF文件是如何转换为程序的内存表示形式的:ELF文件包含其他信息,例如程序(虚拟)地址空间中程序的每个段应加载的位置,应该加载哪些动态库,如何将主程序和动态库链接在一起,如何初始化程序,程序的入口在哪里等。

可执行文件或共享库的一个重要部分是必须加载到程序地址空间中的段的位置。您可以使用readelf -l以下命令查看它们:

$ readelf -l /bin/bash

Elf file type is EXEC (Executable file)
Entry point 0x4205bc
There are 9 program headers, starting at offset 64

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  PHDR           0x0000000000000040 0x0000000000400040 0x0000000000400040
                 0x00000000000001f8 0x00000000000001f8  R E    8
  INTERP         0x0000000000000238 0x0000000000400238 0x0000000000400238
                 0x000000000000001c 0x000000000000001c  R      1
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
                 0x00000000000f1a74 0x00000000000f1a74  R E    200000
  LOAD           0x00000000000f1de0 0x00000000006f1de0 0x00000000006f1de0
                 0x0000000000009068 0x000000000000f298  RW     200000
  DYNAMIC        0x00000000000f1df8 0x00000000006f1df8 0x00000000006f1df8
                 0x0000000000000200 0x0000000000000200  RW     8
  NOTE           0x0000000000000254 0x0000000000400254 0x0000000000400254
                 0x0000000000000044 0x0000000000000044  R      4
  GNU_EH_FRAME   0x00000000000d6af0 0x00000000004d6af0 0x00000000004d6af0
                 0x000000000000407c 0x000000000000407c  R      4
  GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000000000 0x0000000000000000  RW     10
  GNU_RELRO      0x00000000000f1de0 0x00000000006f1de0 0x00000000006f1de0
                 0x0000000000000220 0x0000000000000220  R      1
Run Code Online (Sandbox Code Playgroud)

每个LOAD(PT_LOAD)条目都描述了一个必须在程序地址空间中加载的段。

读取和处理此信息是ELF加载程序的工作:在典型的OS上,这部分由内核完成,部分由动态链接器完成(ld.so,在ELF中也称为“程序解释器”)。

ARM纯二进制文件

(我对ARM的东西并不了解。)

您显然是在谈论嵌入式平台。在ARM上,一个普通的二进制文件包含该程序的初始内存的原始内容。它不包含诸如字符串表,符号表,重定位表,调试信息之类的东西,而仅包含(PT_LOAD)段的数据。

它是一个二进制文件,未进行十六进制编码。该VHX文件是十六进制编码。

可以使用fromelf从ELF文件生成纯二进制文件。

这里的基本思想是将ELF文件的每个PT_LOAD条目转储到文件中的正确位置,并且它们之间的剩余间隙(如果有)都填充为零。

ELF文件已经在每个段的p_vaddr字段中分配了地址,因此此转换过程无需确定地址:链接编辑器(和链接描述文件)已完成此操作。

参考文献