北屋教程网

专注编程知识分享,从入门到精通的编程学习平台

静态链接解析:为什么“打包”后可执行程序会变大?

0.简介

前面文章中已经对于编译链接整体流程以及目标文件格式进行了解读,本文将会介绍静态链接的原理,帮助读者了解静态链接流程以及其优缺点。

1.静态链接整体说明

对于静态链接来说,其核心功能就是将输入的几个目标文件整合后输出一个可执行文件(可以理解其解决了前期通过分治方式模块化编码的后期整合问题)。既然是整合,其避免不了的就是整合方式的选择,最简单的就是各个.o的各个段直接叠加,另外一种就是按段进行整合,相同段进行合并。第一种优势就是简单,但因为一些地址空间对齐会造成空间浪费;第二种的话稍复杂一些,但避免了空间的浪费,所以一般都是使用方式二。整合完之后接下来就应该考虑如何找到符号地址了,其通过第一步收集到的信息(如段数据,重定位信息等)来进行符号的解析和重定位。

接下来本文将使用下面两个程序来分析静态链接做的事情:

//main.c
extern int nExt;
int main()
{
    int nData = 50;
    swap(&nData, &nExt);
    return 0;
}
//func.c
int nExt = 1;
void swap(int* a, int* b){
    int tmp = *a;
    *a =  *b;
    *b = tmp;
}

通过执行下面命令来分别生成main.o,func.o以及链接后的a.out。

#需要-fno-stack-protector关闭栈保护的检查,不然需要链接libc,影响后续分析
gcc -c main.c -fno-stack-protector
gcc -c func.c -fno-stack-protector
ld main.o func.o -e main -o a.out

我们先来看main.o的整体内容objdump -h main.o:

接下来来看func.o的内容objdump -h func.o:

接下来是a.out的内容objdump -h a.out:

从上面可以看到段合并的效果,main.o的.text段大小为2d,func.o的.text段大小为31,而a.out的.text段大小为5e,刚好为二者相加;而链接在段合并的同时还计算了各个部分加载到内存时的虚拟地址,也就是VMA,可以看到其和file off的区别,一个是加载到内存的地址,一个是文件中的偏移。接下面我们详细来看链接过程的符号解析和重定义。

2.符号解析和重定位

符号解析我们可以先看一下main.o和func.o以及a.out的符号信息:

readelf -s main.o

可以看到其都处于未定义的状态。

readelf -s func.o

可以看到其处于全局定义的状态。

readelf -s a.out

可以看到其不再是未定义状态,那么其地址是怎么来的那?又是如何知道那个地方需要重定位那?首先来看地址是怎么来的,我们来回顾一下a.out的整体信息,其中text段VMA地址是401000,而main.o的.text段大小是2d,合并后大小就是40102d,接下来是func.o的text段,swap函数相对偏移地址是0,所以应该为40102d,我们可以通过objdump -d a.out来看地址,其他符号也是类似的原理。

接下来我们来看第二个问题,如何知道哪些指令要被调整那?其依赖于重定位段,我们来看main.o中的重定位段objdump -r main.o,以swap为例可以看到其在text段的22位置需要进行R_X86_64_PLT32类型的重定位。

接下来来看这个22地址对应的指令,objdump -d main.o,可以看到其对应的刚好是callq后的地址,也就是重定位的入口。重定位就是根据这种方式去做的。

3.链接优化及静态链接优缺点

在链接过程中编译器会有一些优化项:

1)重复代码消除:比如实例化模板实例化多份,多个cpp文件中有重复。

2)静态库的特殊处理:.a其本质上就是一堆.o文件的集合,链接时可以按需提取,递归解析依赖。

3)可以使用命令使得静态库变小:通过分离调试信息可以使得输出文件变小:objcopy --strip-debug xxx。

优缺点我们可以根据去原理来进行理解:

1)优点:运行独立,部署简单;启动速度快,无需动态链接器。

2)缺点:可执行文件体积大;更新维护困难,必须全量编译替换;不适合动态扩展场景(如插件)。

4.总结

本文描述了静态链接的过程和基本原理,其在输出文件里整合了所有的.o文件信息,这就是“打包”后变大的原因,接下来的文章将去讲述动态链接原理,去理解其如何做到缩小程序体积以及“一次编译,多程序调用”。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言