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

前言

    2013年底参加了Chinaunix组织的有奖图书阅读活动,并有幸获得了自己想要的<<深度探索linux操作系统>>一书, 作者:王柏生。

    由于年底赶项目,读书进度很慢,只看到第二章。 但从这有限的了解中,我能感觉作者在用心编写这本书,很多深奥、晦涩的技术知识点都讲解的很详细。

    为了表达对该书的作者的感谢和支持,我会坚持把书读完,然后写一系列读书笔记/体会。

 

静态库和动态库生成的异同

本书第二章对程序的编译、汇编、链接过程讲述的非常详细。此外下图所示ELF文件的结构非常经典。看完之后就茅塞顿开。

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的构成。

static

从上可以得出如下结论,静态库实际上就是各个obj文件的简单合成,没有为符号分配运行时地址(g_foo2等符号地址全为0),更没有重定位。

 

动态库就不一样,如下图所示, g_foo2地址非0.  至于重定位,我个人认为在动态库生成阶段并没有发生,原因是如果在foo2.c定义了一个未定义的变量,gcc不会报错。 重定位应该发生在可执行文件生成阶段,如main.c和libfoo.so连接时,此时如果在libfoo.so中有未定义变量,gcc就会报链接错误。

dyn1dyn2

 


 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ltshan139

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值