Linux 链接器的奥秘
@TOC
前言
一、链接器介绍
链接器(Linker)是编译过程中的最后一个阶段,主要用于将多个目标文件(Object Files)以及其他相关的库文件链接在一起,生成最终可执行文件或者共享库。链接器的作用是解决程序中的符号引用问题,将各个目标文件之间的引用关系解析成实际的内存地址,使得程序能够正确地执行。
由于==目标文件 :每个段没有具体的起始地址,只有段大小信息。 各个标识符没有实际地址,只有段中的相对地址==。所以 , 段和标识符的实际地址需要链接器具体确定。
链接器的主要工作就是 将目标文件 和 库文件 整合为最终的可执行程序。
- 合并各个目标文件中的段。
- 确定各个段 和 段中标识符的最终地址(重定位)。
例如:下面由两个文件 func.c 和 test.c 文件。
func.c :
#include <stdio.h>
void fun()
{
printf("Hello world!\n");
return ;
}
test.c :
#include <stdio.h>
int g_global = 0;
extern void fun();
int main(int argc, char *argv[])
{
fun();
return 0;
}
将 func.c 和 test.c 编译成目标文件。可以使用 nm
命令查看目标文件中的符号及对应地址。
可以看到 其中的 标识符只有相对地址,并没有实际地址。段和标识符的实际地址需要链接时才能具体确定。
下面将 目标文件进行链接,生成可执行程序。使用 nm
命令可以看到可执行程序的段 和 标识符都具有其实际地址。
二、链接器脚本
链接脚本(Linker Script)是一种用于指导链接器工作的脚本文件。它描述了目标文件和库文件在链接过程中的排列方式、地址空间的分配以及其他与链接相关的配置信息。链接脚本由链接器解析和执行,以确定生成的可执行文件或共享库的内存布局和链接规则。链接脚本通常使用一种特定的语言或格式编写。
链接脚本的主要作用是为链接器提供指导,确保生成的可执行文件或共享库在内存中能够正确运行。它可以用于优化代码、控制内存分配、实现文件布局等方面,以满足特定需求。通过编写和配置链接脚本,开发人员可以更好地控制程序的链接过程,并更好地适应不同的硬件和操作系统环境。
三、
总结
总而言之,链接器是编译过程中非常重要的一环,它负责将多个目标文件和库文件链接在一起,解决符号引用问题,最终生成可执行文件或共享库。通过链接器的工作,我们可以将程序模块化、复用代码,并且能够更好地控制程序的执行。
- 点赞
- 收藏
- 关注作者
评论(0)