码迷,mamicode.com
首页 > 其他好文 > 详细

ELF--动态链接

时间:2016-12-11 18:23:28      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:想法   分离   alt   文件   elf   turn   地址   执行   函数   

对前面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--动态链接

标签:想法   分离   alt   文件   elf   turn   地址   执行   函数   

原文地址:http://www.cnblogs.com/fellow1988/p/6159926.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!