链接(Linking)
来源:互联网 发布:暴雪mac可以玩的游戏 编辑:程序博客网 时间:2024/05/16 10:42
- intro
- 为什么需要link呢
- linker主要做了哪些工作呢
- 目标文件
- ELF
- Symbol Link
- 链接器变量
- Symbol Resolution
- Local Symbol
- Linker Symbol Rule
- Relocation
- Packaging Lib
- static libaries
- Dynamic lib
- lib interpositioning
转载请注明出处:http://blog.csdn.net/c602273091/article/details/53634299
链接器使得分离编译成为可能。接下来让我们对链接器有一个更加清楚的认识吧。
intro
举个例子:
为什么需要link呢?
1、模块化:代码可以写成好几个而不是写在一个源文件里面。
2、高性能:可以分离编译,改变一个文件,只需要对改变的文件进行重新编译。
在这里有个特别要说明的就是链接库。有的库是静态链接,整个库都放进了代码里面跑;还有一个是动态链接,在运行时把需要的代码加在进去。
linker主要做了哪些工作呢?
1、进行符号的确认:在源码中有符号定义,比如函数定义;也有函数索引。链接器就是把每个变量索引与唯一的一个变量定义进行关联(全局变量和函数调用)。所以就有了符号表。
2、relocate,重定位。将不同的部分链接成一个部分。把每个变量和函数的位置确定。
目标文件
1、.o 文件。可重定位文件,包含二进制代码和数据、编译时和其它可重定位目标文件合并起来,创建可执行目标文件。
2、 .out 文件。可执行文件,直接放进去内存中执行。
3、.so 文件。共享目标文件,动态链接库,在windows下就叫做dll。在加载或者是在运行的时候进行链接。
以上都是ELF(executable and linkable format)。
ELF
ELF各个格式的介绍:
Symbol Link
链接器变量
链接器会链接的变量:这里的local symbol不是局部变量(局部变量在占栈中),而是定义成static的变量。
Symbol Resolution
现在看一个例子,看其中的symbol是怎么定义和ref的。
Local Symbol
对于局部的static类型的变量,存储在.data的结构中。
有多个定义的时候,引用的来源就看强弱了。
Linker Symbol Rule
使用上面的gcc命令,如果在文件中一引用有多个weak,那么就会报错。
Linker的小测试:
对于全局变量:
Relocation
链接之后:
load ELF:
Packaging Lib
链接一些常用的库一般有两种方法:
以上这两种就是静态链接和动态链接。
static libaries
.a file。
举一个例子:
只调用一个函数,整个文件都要进行编译。
链接器算法:
Dynamic lib
static lib的缺点:
所以共享库被提出,用这种库可以动态地把数据和代码加载进去。
.so file。
第一次链接并没有把需要的库load进去,只是做了标记。第二次在运行的时候才会引用已经在内存中的共享库了。
下面看一个动态分配的例子:
lib interpositioning
可以用来debug、安全、内存泄漏等等。
举一个例子:
link interpositioning没看懂,以后再说。
The image from this blog is from CMU 15213, linking
- 链接基本原理(Linking)
- 链接(Linking)
- Deep Linking(深度链接)
- SWFAddress--深度链接(Deep linking)
- 深度链接(Deep linking)--2
- Deep linking 深度链接
- Flex里的深度链接(Deep Linking)
- iOS 中的 Deferred Deep Linking(延迟深度链接)
- iOS 中的 Deferred Deep Linking(延迟深度链接)
- iOS 中的 Deferred Deep Linking(延迟深度链接)
- 【调研】关于Entity Linking(实体链接)的材料收集
- Deep Linking 深度链接 2
- (7)使用Lucene、LingPipe做实体链接(Entity Linking)——根据用户输入进行entity recognition/linking
- 跨库查询(OpenDataSource)与链接服务器(Linking Server)
- (3)使用Lucene、LingPipe做实体链接(Entity Linking)——思路描述
- (4)使用Lucene、LingPipe做实体链接(Entity Linking)——数据预处理
- Android:链接到你的产品(Linking to Your Products)
- 关于VC++的增量链接(Incremental Linking)
- iOS两个应用间的跳转
- 关于友盟分享问题
- 一个布局算法问题解析
- 原始 java 载入数据源 JNDI及直连
- linux 网络配置
- 链接(Linking)
- 在项目中导入环信EaseUI出现.os文件找不到的问题
- 如何使用知网
- Android全局异常捕获并弹窗提示
- 限制软件试用期的简单思路
- Java生成随机长度指定密码
- 专访|从程序员到架构师:交流和分享最能让技术人进步
- iOS下载历史版本App教程
- ios开发--Objective-C 类属性