我是编译器的初学者,但我对学习程序的结构(二进制)以及如何在内存中读取和加载以执行它非常感兴趣。你们有什么电子书/书籍/教程建议我快速入门阅读?
答案 0 :(得分:4)
ELF文件有两个视图:
- 程序标题显示在运行时使用的段
- 部分标题列出了二进制文件的部分
每个ELF文件由一个ELF标头组成,后跟文件数据。
文件数据可包括:
- 程序标题表,描述零个或多个段
- 章节标题表,描述零个或多个部分
- 数据由程序标题表或节标题表
中的条目引用这些段包含运行时执行文件所必需的信息,而部分包含重要数据 连接和搬迁。整个文件中的任何字节都可以由at拥有 大多数一节,并且可能存在不属于的孤立字节 任何部分。
在计算中,加载器是操作系统的一部分 负责加载程序。
这是其中一个重要的阶段 启动程序的过程,因为它将程序放入内存 并准备他们执行。
加载程序涉及:
- 读取可执行文件的内容,包含程序文本的文件, 进入记忆
- 执行其他必要的准备任务 准备运行的可执行文件。
加载完成后,即可 操作系统通过将控制传递给已加载的程序来启动程序 程序代码。
在Unix中,加载器是系统调用
execve()
的处理程序。Unix加载程序的任务包括:
- 验证(权限,内存要求等)
- 将程序映像从磁盘复制到主内存
- 在堆栈上复制命令行参数
- 初始化寄存器(例如,堆栈指针)
- 跳转到程序入口点(
_start
)
答案 1 :(得分:4)
编译器和可执行二进制文件是远程相关的。 (实际的可执行文件是由链接器ld
构建的,而不是编译器构建的。
在Linux系统上,linux kernel使用copy-on-write和demand-paging技术延迟加载ELF可执行文件的程序页面。共享库可能为dynamically loaded,最好包含position independent code。
您可能有兴趣阅读compiler construction,Levine的书籍linkers & loaders,Linux Assembly Howto,Program Library Howto,ldd(1),{{3} },execve(2),intro(2),fork(2),mmap(2),dlopen(3),elf(5),proc(5)手册页。
还要了解cat /proc/self/maps
向您展示的内容(执行该cat
的流程的内存映射)。您也可以使用objdump
。