发现一本硬核书<<程序原理>>,有难度,有深度,推荐一下! 全面系统讲解程序原理,由浅入深,理论结合实践,图文并茂。 既能当一本百科全书,也能当一本架构书。 适合广大技术人。居家旅行,打怪升级,必备良药。
书在github: github.com/drink-cat/B…
========================
抽查部分内容:
ELF 的含义和组成 ELF 的全称为 Executable and Linkable Format,可执行可链接的文件格式。 ELF 是通用格式,支持可执行程序文件、静态库文件、动态库文件、目标对象文件等。 ELF 的核心概念: 1、符号 symbol symbol 是基本元素。全局变量、方法等都会转为符号。还有许多附加的符号,比如_init、_start、_end。 symbol 的属性主要包括,名称、类型、大小、 所属 section、位置。 symbol 的类型,包括 OBJECT、FUNC、SECTION、FILE 等。OBJECT 表示对象、全局变量,FUNC 表示函数,SECTION 表示段。 2、段 section section 是分组。把同一类型的 symbol 组织在一起。 section 的属性主要包括,名称、类型、权限、地址、大小。 section 的类型,包括 PROGBITS、RELA、SYMTAB、STRTAB 等。PROGBITS 表示程序二进制数据,包括代码段、数据 段、GOT 段、PLT 段等。RELA 表示重定位段。SYMTAB 表示符号表。STRTAB 表示字符串表。 3、段 segment segment 是分组。把类型相同、权限相同的多个 section,合并为一个 segment。目的是页对齐,提高内存使用率, 减少内存浪费。 segment 的属性主要包括,类型、权限、地址、大小、对齐。 4、重定位 relocation 程序来源于多个文件。每个文件可以独立编译为目标文件,其中的符号可能是文件内的相对地址。程序的源码,可 能引用外部目标文件的符号。程序的编译和运行,依赖进程的虚拟地址空间。重定位把引用的符号的地址修正为进 程的虚拟地址空间的地址。 relocation 的属性主要包括偏移、类型、符号名、补充值。 relocation 的类型包括 R_X86_64_32、R_X86_64_PC32 等。R_X86_64_32 表示绝对重定位,地址用 32 位表示。 R_X86_64_PC32 表示相对重定位,偏移值用 32 位表示。