ELF动态链接
静态链接通过将整个库都编译到可执行文件的方式来生成可执行文件,而动态链接则利用共享库来实现可执行文件对共享库中函数的调用,在执行时将共享库加载并绑定到该进程的地址空间中。
1.事前准备
由于要探究的是共享库,所以我们需要实现一个共享库文件:
首先是头文件:
add.h:
#ifndef ADD_H
#define ADD_H
int add(int a,int b);
#endif
然后是实现文件:
add.c:
#include "add.h"
int add(int a,int b)
{
return a+b;
}
最后编译一波生成.so文件:
gcc -shared -fPIC add.c -o libadd.so
这里shared参数说明要生成一个共享库。
PIC意为position independent code,意思是说生成的代码中没有绝对地址,全部是相对地址,这也是为了共享库的通用性而加的。
这样就生成了一个只有函数的共享库。
可以用readelf -h libadd.so查看一下ELF头:
ELF 头:
.......
类型: DYN (共享目标文件)
可以看到类型是共享目标文件,使用readelf -l 查看它的段的话也会发现没有INTERP段,因为它不需要程序解释器。
接下来编写一个简单的a+b程序调用一下这个共享库,为了防止其他共享库造成影响,这里并没有IO过程:
test.c:
#include "add.h"
int main(){
int a=1,b=2;
int c=add(a,b);
return