我的理解是二进制文件是处理器指令的十六进制代码(可以加载到存储器中并从入口点开始执行),而ELF文件与分配给数据的NO-固定存储器地址相同. ..
现在,我如何将ELF转换为二进制?
转换如何运作?我的意思是如何分配内存地址?
最佳答案 一般来说
ELF文件不需要使用“NO-Fixed memory addresses”.实际上,典型的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
每个LOAD(PT_LOAD)条目描述了必须在程序地址空间中加载的段.
读取和处理这些信息是ELF加载器的工作:在典型的操作系统上,这部分由内核完成,部分由动态链接器(ld.so,在ELF用语中也称为“程序解释器”)完成.
ARM纯二进制文件
(我真的不知道ARM的东西.)
你显然在谈论嵌入式平台.在ARM上,plain binary file包含程序初始内存的原始内容.它不包含诸如字符串表,符号表,重定位表,调试信息之类的内容,而只包含(PT_LOAD)段的数据.
它是一个二进制文件,不是十六进制编码的. vhx文件是十六进制编码的.
可以使用fromelf从ELF文件生成纯文本二进制文件.
这里的基本思想是ELF文件的每个PT_LOAD条目被转储到文件中的正确位置,并且它们之间的剩余间隙(如果有的话)用零填充.
ELF文件已经在每个段的p_vaddr字段中分配了地址,因此该转换过程不需要确定地址:这已经由链接编辑器(和linker script)完成.
参考