ELF文件格式详细解析(一)

  ELF(Executable and Linking Format)是一种对可执行文件,目标文件和库使用的文件格式。替代了早年的a.out格式。

 

优点:同一文件格式可以用于内核支持的几乎所有的体系结构上。简化了用户空间的工具程序的创建,也简化了内核自身的设计。

    文件格式相同并不意味着不同系统之间存在兼容性:FreeBSD和Linux都适用ELF作为二进制格式,尽管二者在文件中组织数据的方式相同,但在系统调用机制

 以及系统调用的 语义方面,仍有差别。所以FreeBSD程序不能在Linux下运行。

  二进制程序不能在不同体系结构间交换。因为底层体系结构完全不同。

  对所有体系结构而言,程序本身的相关信息以及程序的各个部分在二进制文件中编码的方式都是相同的。

1. 可重定位的对象文件(Relocatable object file)

  由汇编器汇编生成的.o文件。

  然后连接器(link editor)拿一个或一些Relocatable object files作为输入,经过链接后,生成一个可执行的对象文件(Executable object file)

或者一个可被共享的对象文件(Shared object files)。

  使用ar工具将众多的.o文件归档(archive).a静态库文件。

  内核可加载模块.ko也是Relocatable object file。

2. 可执行的对象文件(Executable object file)

3. 可被共享的对象文件(Shared object file

  动态库文件(.so文件)。

  使用静态库(.a)来生成可执行程序,每个生成的可执行程序都会有一份库代码的拷贝,浪费磁盘空间,运行时浪费内存。

  动态库文件(.so文件)则不会出现该问题。

  动态库文件(.so文件)发挥作用的过程必须经过两个步骤:

    a)链接编辑器(link editor)拿它和其他的Relocatable object file以及其他shared object file作为输入,

  经过链接处理后生成Shared object file或Executable object file。

    b)在运行时,动态链接器(dynamic linker)拿它和Executable object file以及另外一些Shared object file一起处理,在Linux系统里创建一个进程映像。

 

布局:

  

  为什么有Linking View 和Excution View?因为ELF格式需要使用在两种场合:

    a)组成不同的可重定位文件,以参与可执行文件或者可被共享文件的链接构建。

    b)组成可执行文件或者可被共享的文件,以在运行时内存中进程映像的构建。

posted @ 2016-03-04 13:10  若离相惜  阅读(1802)  评论(0)    收藏  举报