文档章节

程序要需要知道的链接知识

永远对你好
 永远对你好
发布于 2016/07/29 16:21
字数 1475
阅读 20
收藏 0

1.定义 definition: 变量的定义使得编译器为这个变量分配一块内存,有些还可能要填充特定的值。函数的定义,编译器为这个函数产生一段代码。

2.声明 declaration: 告诉编译器,我们在程序的别处,很肯能在别的文件中,庸这个名字定义了内容。

3.有些时候定义也被认为是声明,即在定义的同时,也在此处进行了声明。

4.变量分两种: 全局变量(global variables)生命周期在整个程序过程中,可以被不同模块访问;局部变量(local variables)声明周期只在与执行的函数过程中,只能在函数内部访问。

5.不太直观的情况: static修饰的局部变量实际上是全局变量 虽然他们仅仅在某个函数中科技,但生命周期存在于整个程序中。
                   static修饰的全局变量也是全局的。尽管他只能在所在文件内的函数访问。
                   
 6. static修饰函数,函数只能被文件内调用。
 
 7.无论全局,还是局部变量,如果所占内存已经预先填充好某个特定值,说明已经被初始化。
 
 8.声明就是对编译器的承若:保证这个变量或函数已经在程序的其他地方定义过了。链接器就是来兑现这一承诺。
 
 9.但在编译阶段,编译器会把这个承诺作为一个空白也就是引用reference保留下来。
 
 10.nm命令分析:
    a.U: 未定义引用(undefined reference)
    b.t/T: 指明了代码(在text section)定义的位置。 t static函数 , T 非 static函数
      c.d/D:表示一个已经初始化的变量在data Section。d局部变量,D全局变量。
    d.b/B: 没有初始化的变量在bss section。b 静态(static)变量或是local变量, 否则用B或C
        e. C /c 。common symbols是未初始化的变量。链接的时候多个common symbol可能会有同样的名字。如果这个symbol在某个地方定义了,common symbol就被是为undefined reference未定义引用。
    11.因此,UNIX 系统上的链接器不会为符号的重复定义——或者说不会为未初始化全局变量的重复符号——抛出任何信息,这种情况相当正常(有时,我们将这种情况称为链接时的“松引用/定义模式(relaxed ref/def mode)”模式)。如果你为此感到苦恼(你也完全有理由苦恼),那么你可以查看你所使用的编译器和链接器的相关文档,里面通常会提供一个 –work-properly 选项,用于“收紧”链接器的检测规则。例如,GNU 工具包里提供了 -fno-common 选项,可以让编译器强行将未初始化变量存放于 BSS 段,而不是存于 common 段。
    
    12.局部变量在stack中。 malloc的内存在heap堆中。
   13.我们将这部分内存空间也添加上,这样,我们就得到了一张完整的程序运行时的内存空间示意图。由于堆和栈在程序运行过程中都会动态地改变大小,通常的处理方式是让栈从一个方向向另一个方向增长,而堆则从另一端增长。也就是说,当二者相遇之时就是程序内存耗尽之日了(到那时,内存空间就被占用得满满当当啦!)。
   14.补充: 动态链接只有一份copy,由操作系统来实现:操作系统给每个进程的地址空间都是一样的0~2n, 那么某个so的物理地址层面上只有一份拷贝,而在虚拟内存上映射的地址则有操作系统进行映射到不同的虚拟地址。(要不然所有的进程都要让出同样的给so的地址空间,如果有很多个so,麻烦了)
   15.静态库:在连接过程中(我理解一般要按照从左到右不断的parse),会对未解决的符号建立一个未解决符号表(unresolved reference table)。不断的从库中查看是否有匹配的符号,如果有就把表中的resolve掉。知道最后表中如果没有unresolved的,说明链接成功,如果还有剩余代表未成功。
   16.从库中导入文件的粒度: 如果某个符号在某个.o里面,那个这个.o都会被放到表中;所以这个.o中附带的未解决的的reference也会要等待被解决。但如果设定一个符号作为一个section,只会引用使用了的函数变量。
   17.parse 库的顺序会影响符号解决。比如说某个未解决的符号需要的.o在之前就用过了,那这个未解决的符号最后只能剩下了。用一些设定--startgroup --endgroup可以循环parse,直到没有未解决的符号为止。
   18.共享库 shared libaries,也就是.so .链接器发现某个符号在.so中,那么他不会把这个符号的定义加上到最终的可执行文件中,二十将该符号与其对应库名字记录下来(保存在可执行文件中)。当程序运行的时候,操作系统的会完成剩余的工作。
   19.动态库,链接的粒度(更大些):如果引用了某个.so的符号,那这个.so整个都会被映射到程序地址空间。(静态库当然值链接某个.o,当然如果特殊的ld options可以之链接某个函数变量)
   20.ldd命令查看so依赖关系。

© 著作权归作者所有

永远对你好
粉丝 60
博文 32
码字总数 4773
作品 0
深圳
程序员
私信 提问
微信小程序暂停“虚拟支付”,知识付费小程序可以这么玩!

转载于 https://blog.csdn.net/yaoohfox/article/details/80539615 5月8日起小程序关闭虚拟支付,对于此次小程序关闭虚拟支付影响最大的,应该是知识付费/在线教育类的小程序,这类小程序现有...

飞翔的熊blabla
2018/09/21
0
0
C语言编译全过程剖析

一、 摘要 C语言编译的整个过程是非常复杂的,里面涉及到的编译器知识、硬件知识、工具链知识都是非常多的,深入了解整个编译过程对工程师理解应用程序的编写是有很大帮助的,希望大家可以多...

长平狐
2013/01/06
39
0
学习如何理解代码以成为更优秀的程序员

为什么一些程序员似乎有某种神奇的能力在眨眼之间从代码中提取其意义? 为了尝试回答这个问题,我深入到了科学所认知的我们如何理解代码的方式中去。 事实证明,我们对代码理解心理学有了很多...

oschina
2017/10/18
464
0
基础才是重中之重~开发人员你应该认识一下Web主线程

知方可补不足,不知永远为不知!我很喜欢这句格言,说的不错,我们在人生的旅途中,永远不可能对所有知识了如指掌,但我们可以做到尽量多知道些,当你知道它了,它将会成为你的知道领域,从而...

mcy247
2017/12/04
0
0
趣探 Mach-O:FishHook 解析

这是Mach-O系列的第三篇 阅读 源码之前,你可能需要对以下知识有个简单的了解 Mach-O文件格式:趣探 Mach-O:文件格式分析 动态链接相关知识:Mach-O 的动态链接过程 、 趣探 Mach-O:加载过...

Joy_xx
2017/11/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

db.properties

jdbc.driver=com.mysql.cj.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=GMT%2B8&characterEncoding=utf8&useSSL=falsejdbc.username=rootjdbc.pas......

行者终成事
19分钟前
3
0
从 Storm 到 Flink,汽车之家基于 Flink 的实时 SQL 平台设计思路与实践

在 2019 年之前,之家的大部分实时业务都是运行在 Storm 之上的。Storm 作为早期主流的实时计算引擎,凭借简单的 Spout 和 Bolt 编程模型以及集群本身的稳定性,俘获了大批用户。下图是实时计...

阿里云官方博客
19分钟前
4
0
网络安全-Day04

2.1.1 什么是SQL注入 2.1.2 注入分类 2.1.3 MySQL手工注入 2.1.4 sqlmap使用 2.1.5 总结 什么是SQL注入 SQL注入漏洞原理 什么是SQL 结构化查询语言(Structured Query Language),是一种特殊目...

Jerry1101
20分钟前
3
0
docker容器内安装yum,vim等命令,以及配置ls指令

使用国内镜像 mv /etc/apt/sources.list /etc/apt/sources.list.bakecho "deb http://mirrors.163.com/debian/ jessie main non-free contrib" >> /etc/apt/sources.listecho "deb http://......

长恭
20分钟前
3
0
超详细的MySQL8.0.17版本安装教程

下载MySQL MySQL的官网地址:https://www.mysql.com/。 如下图所示: 然后点击DOWNLOADS ==> Community,选择MySQL Community Server。如图所示: 滑到页面的最下面,找到Recommended Downl...

彩色泡泡糖
23分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部