首页 > 代码库 > ELF--动态链接
ELF--动态链接
对前面add.c稍作修改,
#include <stdio.h>
int add_count = 0;
extern int sum_count;
extern void print_log(const char *ident, int line);
int add(int num1, int num2)
{
int result= 0;
result = num1 + num2;
add_count ++;
return result;
}
int sum(int num1, int num2, int num3)
{
sum_count++;
int sum = add(num1, num2);
return add(sum, num3);
}
编译成so。查看ELF program header.
和可执行文件类似,只是LOAD的virtAddr起始地址是0x0.说明so在load到内存中时地址是不确定的。
当系统在装载某个包含so的进程时,也需要装载so。装载器会更具当前地址空间的空闲情况,动态分配一块足够大小的虚拟地址空间给so。
当进程在调用so中的函数和数据时,需要知道这些函数的绝对地址.我们知道函数sum的相对地址0x568,那如何知道他的绝对地址呢。
假设so被装载的目标地址为0x10000000,那么sum的绝对地址为0x10000568.
为使so能够被多个进程link,并节省内存。so需要分离出地址无关代码。主要是希望将so指令部分不要因为装载地址的改变而改变。所以基本想法是将指令中需要被修改的部分分理出来,更数据放在一起。而将指令中不变的部分保持不变,各个进程共享。各个进程各自拥有so数据的副本。
ELF--动态链接