<<深度探索linux操作系统>> 阅读笔记一
2014-02-17 16:51
513 查看
前言
2013年底参加了Chinaunix组织的有奖图书阅读活动,并有幸获得了自己想要的<<深度探索linux操作系统>>一书, 作者:王柏生。
由于年底赶项目,读书进度很慢,只看到第二章。 但从这有限的了解中,我能感觉作者在用心编写这本书,很多深奥、晦涩的技术知识点都讲解的很详细。
为了表达对该书的作者的感谢和支持,我会坚持把书读完,然后写一系列读书笔记/体会。
静态库和动态库生成的异同
本书第二章对程序的编译、汇编、链接过程讲述的非常详细。此外下图所示ELF文件的结构非常经典。看完之后就茅塞顿开。
![](https://img-blog.csdn.net/20140217145722921?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYXZpZGVvaW50ZXJmYWNlcw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
从第二章还可知道,链接分为两个大步骤,第一步是将多个目标文件合成一个文件,并且分配运行时地址; 第二步是符号重定位。
以下面code为例讨论一下生成静态库和动态库的特点。
首先敲入命令生成静态库:ar -r foo.a foo1.c foo2.c,然后用objdump来翻译出foo.a的构成。
![](https://img-blog.csdn.net/20140217162955046?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYXZpZGVvaW50ZXJmYWNlcw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
从上可以得出如下结论,静态库实际上就是各个obj文件的简单合成,没有为符号分配运行时地址(g_foo2等符号地址全为0),更没有重定位。
动态库就不一样,如下图所示, g_foo2地址非0. 至于重定位,我个人认为在动态库生成阶段并没有发生,原因是如果在foo2.c定义了一个未定义的变量,gcc不会报错。 重定位应该发生在可执行文件生成阶段,如main.c和libfoo.so连接时,此时如果在libfoo.so中有未定义变量,gcc就会报链接错误。
![](https://img-blog.csdn.net/20140217163958328?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYXZpZGVvaW50ZXJmYWNlcw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20140217164017890?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYXZpZGVvaW50ZXJmYWNlcw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
2013年底参加了Chinaunix组织的有奖图书阅读活动,并有幸获得了自己想要的<<深度探索linux操作系统>>一书, 作者:王柏生。
由于年底赶项目,读书进度很慢,只看到第二章。 但从这有限的了解中,我能感觉作者在用心编写这本书,很多深奥、晦涩的技术知识点都讲解的很详细。
为了表达对该书的作者的感谢和支持,我会坚持把书读完,然后写一系列读书笔记/体会。
静态库和动态库生成的异同
本书第二章对程序的编译、汇编、链接过程讲述的非常详细。此外下图所示ELF文件的结构非常经典。看完之后就茅塞顿开。
从第二章还可知道,链接分为两个大步骤,第一步是将多个目标文件合成一个文件,并且分配运行时地址; 第二步是符号重定位。
以下面code为例讨论一下生成静态库和动态库的特点。
<foo1.c> extern char g_foo2; char g_foo1; void foo1func(void) { g_foo2 = 100; g_foo1 = 35; } <foo2.c> char g_foo2; void foo2func(void) { g_foo2 = 40; }
首先敲入命令生成静态库:ar -r foo.a foo1.c foo2.c,然后用objdump来翻译出foo.a的构成。
从上可以得出如下结论,静态库实际上就是各个obj文件的简单合成,没有为符号分配运行时地址(g_foo2等符号地址全为0),更没有重定位。
动态库就不一样,如下图所示, g_foo2地址非0. 至于重定位,我个人认为在动态库生成阶段并没有发生,原因是如果在foo2.c定义了一个未定义的变量,gcc不会报错。 重定位应该发生在可执行文件生成阶段,如main.c和libfoo.so连接时,此时如果在libfoo.so中有未定义变量,gcc就会报链接错误。
相关文章推荐
- <<浪潮之巅>>阅读笔记三
- <<重构手册>>阅读笔记:重构的含义
- <<Linux内核完全剖析 --基于0.12内核>>学习笔记 第4章 80x86保护模式及其编程 4.7 任务管理
- <<深度探索c++对象模型>>第一章读书笔记
- <<梦断代码>>阅读笔记一
- 对<< ubuntu 12.04编译安装linux-3.6.10内核笔记>>的修正
- <<JavaScript编程全解>>阅读笔记之javascript基础
- <<Linux内核完全剖析 --基于0.12内核>> 学习笔记 第4章 80x86保护模式及其编程 4.1 80x86系统寄存器和系统指令
- <<JavaScript编程全解>>阅读笔记之变量与对象
- <<Linux内核完全剖析 --基于0.12内核>>学习笔记 第4章 80x86保护模式及其编程 4.6 中断和异常处理
- <<一个操作系统的实现>>linux下环境搭配
- <<JavaScript编程全解>>阅读笔记之函数与闭包
- <<Linux达人养成计划一>>学习笔记
- <<Linux内核完全剖析 --基于0.12内核>>学习笔记 第4章 80x86保护模式及其编程 4.5 保护
- <<Linux内核完全剖析 --基于0.12内核>>学习笔记 第4章 80x86保护模式及其编程 4.8 保护模式编程初始化
- <<JavaScript编程全解>>阅读笔记之javascript数据类型
- <<浪潮之巅>>阅读笔记一
- <<浪潮之巅>>阅读笔记二
- <<Linux内核完全剖析 --基于0.12内核>>学习笔记 第4章 80x86保护模式及其编程 4.4 分页机制
- 阅读<AXI4-Stream Infrastructure IP Suite v2.2>笔记