库制作与原理小总结

库是写好的现有的,成熟的,可以复用的代码,库的本质是把很多.o文件打包

静态库:程序在编译链接的时候把库的代码链接到可执行文件里面,程序运行时将不再需要静态库

一个可执行程序可能用到许多的库,有静有动,我们的编译默认是动态链接库,只有找不到动态.so的时候才会采用同名静态库,我们也可以用gcc的-static强转设置链接静态库

动态库:程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码

在可执行文件开始运行以前 外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,该过程称为动态链接

我们认识的很多文件 都有一个统一的分类:

ELF文件 Linux特有

如 可重定位文件:xxx.o文件 包含适合与其他目标文件链接来创建可执行文件或者共享目标文件的代码和数据

可执行文件:可执行程序

共享目标文件:xxx.so文件

内核转储:存放当前进程的执行上下文,用于dump信号触发

ELF文件的组成:

ELF头:描述文件的主要特性,位于文件的开始位置,主要目的是定位文件其他部分

程序头表:列举所有有效段和他们的属性,表里记录着每个段的开始位置和位移,长度,因为它们被放在二进制文件中,需要段表的描述信息,才能把它们每个段分割开

节头表:对节的描述

节:ELF文件中的基本组成单位,包含特定类型的数据

一个ELF文件没有加载进内存的时候依然有地址,计算机工作的时候都采用平坦模式进行工作,所以也会对自己的代码和数据统一编制。

静态链接 就是把库中的.o合并

链接就是把编译之后的所有目标文件连同用到的一些静态库运行时库组合,拼装成一个独立的可执行文件。当所有模块组合在一起之后,链接器会根据我们的.o文件或者静态库的重定位表找到那些需要被重定位的函数全局变量,从而修正它们的地址。

动态链接就是把链接的整个过程推迟到了程序加载的时候,运行程序时,操作系统会首先将程序的数据代码连同它用到的一系列动态库先加载到内存,其中每个动态库的加载地址都是不固定的,操作系统会根据当前地址空间使用情况动态分配一段内存。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值