- 1、本文档共71页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C 语言学习笔记第三部分:系统.pdf
C 语⾔学习笔记第三部分:系统
第三部分: 系统
1. ELF File Format
Executable and Linking Format ,缩写 ELF 。是 Linux 系统⽬标⽂件 (Object File) 格式。
主要有如下三种类型:
(1) 可重定位⽂件 (relocatable file) ,可与其它⽬标⽂件⼀ 创建可执⾏⽂件或共享⽬标
⽂件。
$ gcc -g -c hello.c
$ file hello.o
hello.o: ELF 32-bit LSB relocatable, Intel 80386, ver ion 1 (SYSV
(2) 可执⾏⽂件 (executable file) 。
$ gcc -g hello.c -o hello
$ file hello
hello: ELF 32-bit LSB executable, Intel 80386, ver ion 1 (SYSV),
lib ), for GNU/Linux 2.6.15, not tripped
(3) 共享⽬标⽂件 (shared object file) ,通常是 函数库 ,可静态链接到其他 ELF ⽂件
中,或动态链接共同创建进程映像 (类似 LL) 。
$ gcc - hared -fpic tack.c -o hello. o
$ file hello. o
hello. o: ELF 32-bit LSB hared object, Intel 80386, ver ion 1 (S
tripped
1.1 基本结构
我们可以从⽂件 (Linking) 和执⾏ (Execution) 两个⾓度审视 ELF 结构
(/usr/include/elf .h) 。
和 Windows COFF 格式类似,ELF 也有⼀个特定的⽂件头,包括⼀个特定的标志串
(Magic) 。
⽂件头中描述了 ELF ⽂件版本 (Version) ,⽬标机器型号 (Machine) ,程序⼊⼜地址
(Entry point Address) 等信息。紧接其后的是可选的程序头表 (Program Header Table) 和
多个段(Section) ,其中有我们所熟悉的存储了执⾏代码的 .text 段。
ELF 使⽤段表 (Section Header Table) 存储各段的相关信息,包括名称、 始位置、长
度、权限属性等等。除了段表,ELF 中还有符号表 (Symbol Table)、字符串表 (String
Table ,段、函数等名称) 等。
Section 和 Segment 中⽂翻译虽然都是 段 ,但它们并不是⼀个意思。Section 主要是
⾯向⽬标⽂件连接器,⽽ Segment 则是⾯向执⾏加载器,后者描述的是内存布局结
构。本⽂主要分析 ELF 静态⽂件格式,也就是说主要跟 Section 打交道,⽽有关 ELF
进程及内存布局模型将另⽂详述。
相关分析将使⽤下⾯这个例⼦,如⾮说明,所有⽣成⽂件都是32位。
$ cat hello.c
#include tdio.h
int main(int argc, char* argv[])
{
printf(Hello, World!\n);
return 0;
}
$ gcc -g -c hello.c
$ gcc -g hello.c -o hello
$ l
hello.c hello.o hello
$ file hello
hello: ELF 32-bit LSB executable, Intel 80386, ver ion 1 (SYSV),
lib ), for GNU/Linux 2.6.15, not tripped
附: ELF⽂件标准历史
20世纪90年代,⼀些⼚商联合成⽴了⼀个委员会, 草并发布了⼀个 ELF ⽂件格式标
准供公开使⽤,并且希望所有⼈能够遵循这项标准并且从中获益。1993年,委员会发
布了 ELF ⽂件标准。当时参与该委员会的有来⾃于编译器的⼚商,如 Watcom 和
Borland ;来⾃ CPU 的⼚商如 IBM 和 Intel ;来⾃操作系统的⼚商如 IBM 和
Microsoft 。1995年,委员会发布了 ELF 1.2 标准,⾃此委员会完成了⾃⼰的使命,不
久就解散了。所以 ELF 最新版本为1.2 。
1.2 ELF Header
文档评论(0)