Linux Linker
来自百度知道。
提炼一下:
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技术。
新的知识点:程序编译生成符号表,符号与地址对应,链接中进行符号解析,然后再进行内存分配(按段重组),链接器再进行模块内未定义符号重定位。
Linux Linker的更多相关文章
- Linux Linker Script
先推荐两个网页: http://blog.csdn.net/muyuyuzhong/article/details/7755291 http://www.cnblogs.com/liulipeng/a ...
- Linux 驱动开发
linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...
- Nginx源码完全注释(8)ngx_errno.c
errno.h中的strerror(int errno)可以确定指定的errno的错误的提示信息.在 Nginx 中,将所有错误提示信息预先存储在一个数组里,而预先确定这个数组的大小,是在自动化脚本中 ...
- Linux Dynamic Shared Library && LD Linker
目录 . 动态链接的意义 . 地址无关代码: PIC . 延迟版定(PLT Procedure Linkage Table) . 动态链接相关结构 . 动态链接的步骤和实现 . Linux动态链接器实 ...
- Linux Kernel系列三:Kernel编译和链接中的linker script语法详解
先要讲讲这个问题是怎么来的.(咱们在分析一个技术的时候,先要考虑它是想解决什么问题,或者学习新知识的时候,要清楚这个知识的目的是什么). 我在编译内核的时候,发现arch/arm/kernel目录下有 ...
- linux 修改 elf 文件的dynamic linker 和 rpath
linux 修改 elf 文件的dynamic linker 和 rpath https://nixos.org/patchelf.html 下载地址 https://nixos.org/releas ...
- Linux ToolChain (二) --- Linker (1)链接选项 -L -rpath -rpath-link
一.动态库的链接和链接选项-L,-rpath-link,-rpath (1). 现代连接器在处理动态库时将链接时路径(Link-time path)和运行时路径(Run-time path)分开, 用 ...
- Linux下服务器端开发流程及相关工具介绍(C++)
去年刚毕业来公司后,做为新人,发现很多东西都没有文档,各种工具和地址都是口口相传的,而且很多时候都是不知道有哪些工具可以使用,所以当时就想把自己接触到的这些东西记录下来,为后来者提供参考,相当于一个路 ...
- linux下mono播放PCM音频
测试环境: Ubuntu 14 MonoDevelop CodeBlocks 1.建立一个共享库(shared library) 这里用到了linux下的音频播放库,alsa-lib. al ...
随机推荐
- 【Luogu】P2059卡牌游戏(概率DP)
题目链接 这绝壁是道紫难度的题 请移步xyz32678的题解. 设f[i][j]是有i个人参加了游戏,1是庄家,最后j胜出的概率. 我们可以发现,这个游戏影响胜出的概率的只有庄家的相对位置和人数,跟玩 ...
- BZOJ 1813 [Cqoi2017]小Q的棋盘 ——树形DP
唔,貌似以前做过这样差不多的题目. 用$f(i,0/1)$表示从某一点出发,只能走子树的情况下回到根.不回到根的最多经过不同的点数. 然后就可以DP辣 #include <map> #in ...
- 【强化学习】百度云BCC openai gym 环境配置
openai gym是RL算法的测试床.为了直观和便于调试,我们需要可视化界面.然而远程服务器使用openGL的问题比较棘手,这篇博客记录在百度云BCC上配置openai gym环境的注意事项. 按照 ...
- LightOJ1106 Gone Fishing
Gone Fishing John is going on a fishing trip. He has h hours available, and there are n lakes in the ...
- __getattr__ 与 __getattribute__的区别
原文博客地址 http://www.cnblogs.com/bettermanlu/archive/2011/06/22/2087642.html
- 虚拟机vmnet0、vmnet1和vmnet8的区别 虚拟网卡概述
vmnet0,实际上就是一个虚拟的网桥 vmnet0,实际上就是一个虚拟的网桥,这个网桥有很若干个端口,一个端口用于连接你的Host,一个端口用于连接你的虚拟机,他们的位置是对等的,谁也不是谁的网关. ...
- android源码mk文件里的TARGET_OUT指向哪里?
android源码核心变量大都在build/core/envsetup.mk中建立 在该文件中,可以找到 TARGET_OUT := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_ ...
- zoj 3822 Domination(2014牡丹江区域赛D题) (概率dp)
3799567 2014-10-14 10:13:59 Acce ...
- Yii 之数据库查询
模型代码: <?php namespace app\models; use yii\db\ActiveRecord; class Test extends ActiveRecord{ } 控制器 ...
- git多人协作--分支
分支: 创建分支: git checkout -b 新分支 切换分支: git checkout 目标分支 删除分支: git branch -d 待删除分支 推送到远程分支: git checkou ...