- 从链接原理上看:在编译时,gcc根据makefile的依赖关系,将头文件、实现文件、include进来的文件,组成一个编译单元,编译成一个目标文件。一般include进来的只是函数的声明,并没有实现!在链接器链接时,ln会根据makefile把main函数依赖的所有目标文件进行链接,静态库就是在这个时候链接进来的。
#include <qDebug>
#include <asd.h>
#include <qwe.h>
int main()
{
qDebug() << plus(1,2);
qDebug() << func1(2,2);
return 0;
}
#ifndef ASD_H
#define ASD_H
static int plus(int a,int b)
{
return (a + b);
}
#endif
#include <asd.h>
#ifndef QWE_H
#define QWE_H
#include <asd.h>
int func1(int a,int b);
#endif
#include <qwe.h>
int func1(int a,int b)
{
return plus(a,b);
}
- 用
nm
命令查看目标文件的内容,我们看到qwe.o中有func1和plus,asd.o中有plus,main.o中有func和plus。

gcc qwe.o asd.o main.o
将它们链接起来后,a.out中有3个plus,1个func1,数量恰好为3个目标文件里面的函数之和。 好像链接就是简单地把三个目标文件拼起来了。
下图中,小写表示局部,大写表示全局。U表示未定义的符号,T表示代码段,我们看出static函数都是局部的代码段!

nm
命令只是输出了文件内函数的布局,即文件内有哪些函数,以及每个函数的入口地址,并没有指出程序如何执行,下面用反汇编命令objdump -d
进行对比分析,用反汇编命令能清楚地看出每个函数是如何执行的。- 从下面可以看出,每个函数的入口地址和
nm
命令输出的是相同的。




- 任何一个程序一般是从main函数开始执行的。由下图看出,主函数在两个地方调用了func1和plus函数。并不是所有被链接进来的函数都执行了,在这里是执行了0x691和0x65e处的函数。
