Linux Linker
2024-09-30 08:09:47
来自百度知道。
提炼一下:
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技术。
新的知识点:程序编译生成符号表,符号与地址对应,链接中进行符号解析,然后再进行内存分配(按段重组),链接器再进行模块内未定义符号重定位。
最新文章
- net软件自动生成开发编程框架编程机器人
- SQL探险
- nyoj19_排列
- [DFNews] EIFT更新至1.2,支持iPhone4s及iPhone5物理获取
- 继承 Bean 配置
- perl中shift 和unshift 操作
- percona监控模板图形解释
- ios里面如何压缩图片
- 如何在SourceInsight中选中匹配的大括号中的内容
- es6笔记7^_^class
- DDD「领域驱动设计」分层架构初探
- property与x.setter与x.deleter
- 本地项目托管到github上
- 【RMAN】RMAN-05001: auxiliary filename conflicts with the target database
- RN animated组动画
- 使用Wisdom RESTClient进行自动化测试,如何取消对返回的body内容的校验?对排除的JSON属性字段不做校验?
- c# winform播放声音的两种方式
- Docker 常用命令与操作
- LeetCode: Pascal's Triangle 解题报告
- 【ActiveMQ入门-5】ActiveMQ学习-Queue与Topic的比较
热门文章
- UOJ 274 【清华集训2016】温暖会指引我们前行 ——Link-Cut Tree
- BZOJ 3238 [Ahoi2013]差异 ——后缀自动机
- scrapy介绍及源码分析
- linux命令dhclient
- LA 3135 优先队列
- angular中关于自定义指令——repeat渲染完成后执行动作
- openSUSE Leap 15.0 初始配置
- [Bzoj5254][Fjwc2018]红绿灯(线段树)
- Codeforces 959 D Mahmoud and Ehab and another array construction task
- 谷歌訪问之直接输入ip地址