如何将ELF文件转换为二进制文件?
How to convert ELF file to binary file?
我的理解是二进制文件是处理器指令的十六进制代码(可以加载到内存中并从入口点开始执行),ELF 文件与分配的 NO-Fixed 内存地址相同用于数据等...
现在,如何将 ELF 转换为二进制文件?
转换是如何进行的?我的意思是内存地址是如何分配的?
我不明白你想说什么,ELF(Executable Linkable format)是一种新的可执行格式。当然,它的部分包括 .text 需要映射到内存中才能执行。但是如果你想将 ELF 转换成二进制检查 what is the difference between ELF files and bin files。一些答案包含如何将 ELF 更改为其他二进制格式的信息
为了清楚 ELF 是如何加载到内存中的,请检查 http://www.gsp.com/cgi-bin/man.cgi?topic=elf。如果您还有一些问题,请提出具体问题。
一般
ELF文件不需要使用"NO-Fixed memory addresses"。事实上,典型的 ELF 可执行文件(ET_EXEC)使用的是固定地址。
二进制文件通常被理解为包含非文本数据的文件。在程序的上下文中,它通常被理解为程序的编译形式(与通常是一堆文本文件的源形式相反)。 ELF文件是二进制文件。
现在您可能想知道 ELF 文件如何转换为程序的内存表示:ELF 文件包含附加信息,例如程序(虚拟)地址中的位置-space程序的每一段都应该加载,应该加载哪些动态库,如何link主程序和动态库一起,如何初始化程序,程序的入口点在哪里等等。
可执行文件或共享对象的一个重要部分是必须加载到程序地址 space 中的段的位置。您可以使用 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)条目描述了一个必须加载到程序地址中的段-space.
读取和处理此信息是 ELF 加载程序的工作:在典型的 OS 上,这部分由内核完成,部分由动态 linker (ld.so,在 ELF 中也称为 "program interpreter")。
ARM 纯二进制文件
(我不太了解 ARM 的东西。)
您显然是在谈论嵌入式平台。在 ARM 上,plain binary file 包含程序初始内存的原始内容。它不包含字符串表、符号表、重定位表、调试信息等内容,只包含 (PT_LOAD) 段的数据。
这是一个二进制文件,不是十六进制编码的。 vhx 文件是十六进制编码的。
可以使用 fromelf.
从 ELF 文件生成纯二进制文件
这里的基本思想是将 ELF 文件的每个 PT_LOAD 条目转储到文件中的正确位置,并且它们之间的剩余间隙(如果有的话)用零填充。
ELF 文件已经在每个段的 p_vaddr 字段中分配了地址,因此此转换过程不需要确定地址:link 编辑器(以及linker script).
参考资料
我是在搜索“将 .elf 转换为二进制文件”时来到这里的(尽管考虑到了 arm 文件)。
事实证明,对我来说最简单的方法是使用
arm-none-eabi-objcopy -O binary kernel.elf kernel.bin
我的理解是二进制文件是处理器指令的十六进制代码(可以加载到内存中并从入口点开始执行),ELF 文件与分配的 NO-Fixed 内存地址相同用于数据等...
现在,如何将 ELF 转换为二进制文件?
转换是如何进行的?我的意思是内存地址是如何分配的?
我不明白你想说什么,ELF(Executable Linkable format)是一种新的可执行格式。当然,它的部分包括 .text 需要映射到内存中才能执行。但是如果你想将 ELF 转换成二进制检查 what is the difference between ELF files and bin files。一些答案包含如何将 ELF 更改为其他二进制格式的信息
为了清楚 ELF 是如何加载到内存中的,请检查 http://www.gsp.com/cgi-bin/man.cgi?topic=elf。如果您还有一些问题,请提出具体问题。
一般
ELF文件不需要使用"NO-Fixed memory addresses"。事实上,典型的 ELF 可执行文件(ET_EXEC)使用的是固定地址。
二进制文件通常被理解为包含非文本数据的文件。在程序的上下文中,它通常被理解为程序的编译形式(与通常是一堆文本文件的源形式相反)。 ELF文件是二进制文件。
现在您可能想知道 ELF 文件如何转换为程序的内存表示:ELF 文件包含附加信息,例如程序(虚拟)地址中的位置-space程序的每一段都应该加载,应该加载哪些动态库,如何link主程序和动态库一起,如何初始化程序,程序的入口点在哪里等等。
可执行文件或共享对象的一个重要部分是必须加载到程序地址 space 中的段的位置。您可以使用 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)条目描述了一个必须加载到程序地址中的段-space.
读取和处理此信息是 ELF 加载程序的工作:在典型的 OS 上,这部分由内核完成,部分由动态 linker (ld.so,在 ELF 中也称为 "program interpreter")。
ARM 纯二进制文件
(我不太了解 ARM 的东西。)
您显然是在谈论嵌入式平台。在 ARM 上,plain binary file 包含程序初始内存的原始内容。它不包含字符串表、符号表、重定位表、调试信息等内容,只包含 (PT_LOAD) 段的数据。
这是一个二进制文件,不是十六进制编码的。 vhx 文件是十六进制编码的。
可以使用 fromelf.
从 ELF 文件生成纯二进制文件这里的基本思想是将 ELF 文件的每个 PT_LOAD 条目转储到文件中的正确位置,并且它们之间的剩余间隙(如果有的话)用零填充。
ELF 文件已经在每个段的 p_vaddr 字段中分配了地址,因此此转换过程不需要确定地址:link 编辑器(以及linker script).
参考资料
我是在搜索“将 .elf 转换为二进制文件”时来到这里的(尽管考虑到了 arm 文件)。
事实证明,对我来说最简单的方法是使用
arm-none-eabi-objcopy -O binary kernel.elf kernel.bin