Linux 链接器的奥秘

举报
糖果罐子 发表于 2023/08/31 09:02:33 2023/08/31
【摘要】 @TOC 前言 一、链接器介绍链接器(Linker)是编译过程中的最后一个阶段,主要用于将多个目标文件(Object Files)以及其他相关的库文件链接在一起,生成最终可执行文件或者共享库。链接器的作用是解决程序中的符号引用问题,将各个目标文件之间的引用关系解析成实际的内存地址,使得程序能够正确地执行。由于==目标文件 :每个段没有具体的起始地址,只有段大小信息。 各个标识符没有实际地址,...

@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)是一种用于指导链接器工作的脚本文件。它描述了目标文件和库文件在链接过程中的排列方式、地址空间的分配以及其他与链接相关的配置信息。链接脚本由链接器解析和执行,以确定生成的可执行文件或共享库的内存布局和链接规则。链接脚本通常使用一种特定的语言或格式编写。

链接脚本的主要作用是为链接器提供指导,确保生成的可执行文件或共享库在内存中能够正确运行。它可以用于优化代码、控制内存分配、实现文件布局等方面,以满足特定需求。通过编写和配置链接脚本,开发人员可以更好地控制程序的链接过程,并更好地适应不同的硬件和操作系统环境。

三、


总结

总而言之,链接器是编译过程中非常重要的一环,它负责将多个目标文件和库文件链接在一起,解决符号引用问题,最终生成可执行文件或共享库。通过链接器的工作,我们可以将程序模块化、复用代码,并且能够更好地控制程序的执行。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。