最近在分析Linux模块加载过程的时候。发现模块加载过程和链接过程有点点相似,都需要做重定向、解决符号引用问题。而这些操作都和elf文件格式有着莫大的联系,所以在出模块加载过程分析的文档之前,先分析一下elf文件。
elf全称executable and linkable format,是一种可执行文件、目标文件和库使用的文件的格式。替代了早年的a.out文件格式。linux不仅将elf用于用户空间应用程序和库程序,还用于构建模块。linux内核本身也是elf格式。elf是一种开放格式,其规范可以自由获得。
elf文件的布局和结构,分为可重定位文件和可执行文件。
举个实例Hello.c它的源码如下:
#include <stdio.h>
int main(void)
{
int ret = 0;
printf("hello\n");
return ret;
}
通过命令gcc -c Hello.c生成Hello.o文件,命令gcc -o Hello Hello.c生成Hello文件。
目标文件Hello.o和可执行文件Hello由下图可以看到它们之间的差别,目标文件