文章原文:http://zhidao.baidu.com/link?url=U2Mtcc6BKi4vuQ1MO8U6s9gNm4y9Epphz03veA2lVpRWMozyVdj0PYvw1ZU9qj0WrHLKLnDiacDFcy9Req6CD1VKNrCnv3p6YFwyOXkVvWu

来自百度知道。

提炼一下:

1、模块在编译过程中就会生成符号表,符号表记录模块中的全局函数,全局变量。这些是可以给外部调用的,可以导出符号表。如何在本模块内没有定义,就将此符号定义为“未定义”。在链接阶段会在其他模块符号表中查找此符号。一个符号代表的是一个地址位置,但是相对位置,相对于本模块起始(本模块起始设置为0)。

2、链接器在链接过程中,会扫描各个模块的符号表,得到一个“全局符号表”,这样每一个符号都有一个地址对应。将各模块中符号引用的地方换成定义处的地址,这就叫符号解析。

3、程序的链接过程会整合各个模块的端,如按代码段、数据段、未初始化的数据段等重新组合。这里就会有一个问题,A.text中调用了B.text.Symbol1,因为重新组合而改变了位置,那么A.text中调用B.text.Symbol1的代码就得重改。这就是重定位。

4、静态库在链接时已经被组合到程序(如linux-elf文件)中。如A和B都用到静态库中的所有代码,那么A B的elf中都包含静态库代码。

5、动态库在加载的时候被搬到内存中,且存在被不同程序映射到不同地址空间的可能(如两个应用程序映射虚拟地址都是0~0x1000的反面情况)。那么在动态库中就不应该出现绝对地址引用,引入GOT技术。

新的知识点:程序编译生成符号表,符号与地址对应,链接中进行符号解析,然后再进行内存分配(按段重组),链接器再进行模块内未定义符号重定位。

最新文章

  1. net软件自动生成开发编程框架编程机器人
  2. SQL探险
  3. nyoj19_排列
  4. [DFNews] EIFT更新至1.2,支持iPhone4s及iPhone5物理获取
  5. 继承 Bean 配置
  6. perl中shift 和unshift 操作
  7. percona监控模板图形解释
  8. ios里面如何压缩图片
  9. 如何在SourceInsight中选中匹配的大括号中的内容
  10. es6笔记7^_^class
  11. DDD「领域驱动设计」分层架构初探
  12. property与x.setter与x.deleter
  13. 本地项目托管到github上
  14. 【RMAN】RMAN-05001: auxiliary filename conflicts with the target database
  15. RN animated组动画
  16. 使用Wisdom RESTClient进行自动化测试,如何取消对返回的body内容的校验?对排除的JSON属性字段不做校验?
  17. c# winform播放声音的两种方式
  18. Docker 常用命令与操作
  19. LeetCode: Pascal's Triangle 解题报告
  20. 【ActiveMQ入门-5】ActiveMQ学习-Queue与Topic的比较

热门文章

  1. UOJ 274 【清华集训2016】温暖会指引我们前行 ——Link-Cut Tree
  2. BZOJ 3238 [Ahoi2013]差异 ——后缀自动机
  3. scrapy介绍及源码分析
  4. linux命令dhclient
  5. LA 3135 优先队列
  6. angular中关于自定义指令——repeat渲染完成后执行动作
  7. openSUSE Leap 15.0 初始配置
  8. [Bzoj5254][Fjwc2018]红绿灯(线段树)
  9. Codeforces 959 D Mahmoud and Ehab and another array construction task
  10. 谷歌訪问之直接输入ip地址