您的位置:首页 > 运维架构 > Linux

<<深度探索linux操作系统>> 阅读笔记一

2014-02-17 16:51 513 查看
前言

    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就会报链接错误。





 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: