作为一名Android开发工程师,尤其是音视频领域,NDK开发一直都是主流,但是我们是否有认真了解过我们经常使用的.so等文件具体是怎样的一个格式呢??
一、ELF简介
ELF(Executableand Linking Format 可执行和链接格式),ELF文件格式是一个开放标准,各种UNIX系统的可执行文件都采用ELF格式,它有三种不同的类型:
- 可重定位的目标文件(Relocatable)也就是通常称的目标文件,后缀为
.o
- 可执行文件(Executable)
- 共享库(Shared Object)共享文件:也就是通常称的库文件,后缀为
.so
二、ELF文件结构
注意:段(Segment
)与节(Section
)的区别。很多地方对两者有所混淆。段是程序执行的必要组成,当多个目标文件链接成一个可执行文件时,会将相同权限的节合并到一个段中。相比而言,节的粒度更小。
如图所示,为ELF文件的基本结构,其主要由四部分组成:
- ELF Header
- ELF Program Header Table (或称Program Headers、程序头)
- ELF Section Header Table (或称Section Headers、节头表)
- ELF Sections
从图中,我们就能看出它们各自的数据结构以及相互之间的索引关系。
三、ELF示例
如下是一个C语言的Hello world示例,来帮助我们理解ELF文件类型:
1 |
|
使用如下命令编译:
1 | gcc hello_world.c -o hello_world |
在编译完成后,使用如下命令查看编译完成后的hello_world
ELF文件信息:
1 | readelf -a hello_world |
显示信息如下:
1 | ELF Header: |
如上是一个完成的ELF文件信息,其实对于我们来讲,分析ELF文件格式更多是为了帮助我们理解程序运行的原理,比如程序是如何找到对应的函数等等,其实都是有特定的规则,比如在此文件的238行,我们能够找到我们写的main
函数以及228行中的print函数等,这些信息都是可以帮助我们理解计算机世界里的活动轨迹,关于ELF的更多细节,详见参考链接。