首页 > 代码库 > 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--动态链接