关键词:链接器的意义、链接器的工作内容、程序的启动过程、自定义程序入口函数
1. 链接器的意义
链接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接。即协调目标文件和库文件。
2. 目标文件(.o
)的秘密
- 各个段没有具体的起始地址,只有段大小信息
- 各个标识符没有实际地址,只有段中的相对地址
- 段和标识符的实际地址需要链接器具体确定
3. 链接器的工作内容
-
将目标文件和库文件整合为最终的可执行程序
1)合并各个目标文件的段(.text, .data, .bss)
2)确定各个段和段中标识符的最终地址(重定位)
4. main()是否为第一个被调用的函数?
在Linux的默认情况下(gcc编译器下):
1) 程序加载后,_start()
是第一个被调用执行的函数
2)_start()
函数准备好参数后立即调用_libc_start_main()
函数
3)_libc_start_main()
函数初始化运行环境后调用main()
函数执行
_start()
函数的入口地址是代码段(.text)的起始地址
5. _libc_start_main()
函数的作用:
1) 调用_libc_csu_init()
函数:完成必要的初始化操作
2)启动程序的第一个线程(主线程),main()
为线程入口
3)注册_libc_csu_fini()
函数:程序运行终止是被调用
6. 程序的启动过程
7. 自定义程序入口函数
- gcc提供
-e
选项用于在链接时指定入口函数 - 自定义入口函数时必须使用
-nostartfiles
选项进行链接
#include <stdio.h>
#include <stdlib.h>
int program()
{
printf("jacob2359\n");
exit(0);
}
输入:gcc -e program -nostartfiles program.o -o program.out
输出结果:
jacob2359
声明:此文章为本人在学习狄泰软件学院《十二月提升计划》所做的笔记,参考书籍《专业嵌入式软件开发》——李云,文章中包含狄泰软件资料内容和《专业嵌入式软件开发》资料内容,一切版权归狄泰软件和《专业嵌入式软件开发》所有!