静态链接

本文介绍了链接器的基本概念,包括静态链接和动态链接的区别,并详细解释了链接器如何通过符号解析和重定位来构造可执行文件的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。
每个模块的源代码文件经过编译器编译成目标文件(linux的.o或者win的.obj),目标文件和库(library)一起链接形参最终的额可执行文件。

动态链接库:win的.dll和linux下的.so文件
静态链接库:win的.lib和linux下的.a文件

链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。 
静态链接的最大缺点是生成的可执行文件太大,需要更多的系统资源,在装入内存时也会消耗更多的时间。
Unix ld程序这样的静态链接器(static linker)以一组可重定位的目标文件作为输入,生成一个完全连接的可以加载和运行的可执行目标文件作为输出


输入的可重定位目标文件由各种不同的代码和数据节(section)组成。
指令在一个节中(.text);
初始化的全局变量和局部静态变量在一个节中(.data);
而未初始化的变量在另外一个节中(.bss)----预留位置而已;
除此之外还有文件头,描述文件属性和指定静态或者动态链接的入口地址等。
分节的原因(我的理解):可以避免把数据当成指令执行了;可以提高编译器工作的效率;户对于代码段,只有读的权限,就可以保证代码段不受破坏;在装载到内存之后,更有利于内存的组织,例如内存里的哪一块是堆区,哪一块是栈区,哪一块是代码区;最后就是可以使结构更清晰,可读性更好。

为了构造可执行文件,链接器必须完成两个主要的任务:
1、符号解析(symbol resolution)。目标文件定义和引用符号。符号解析的目的是将每个符号引用(例如函数调用和引用变量)刚好和一个符号定义联系起来。
   注:符号----链接中,我们将函数和变量统称为符号。namespace就是为多模块的符号冲突而生!
2、重定位(relocation)。编译器和汇编器生成从地址0开始的代码和数据节。链接器通过把每个符号定义和一个存储器位置联系起来,然后,修改所有对这些符号的引用,使他们指向这个存储器位置,从而重定位这些节。

目标文件、可执行文件与进程空间:





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值