7_揭开链接器的面纱(上)

关键词:链接器的意义、链接器的工作内容、程序的启动过程、自定义程序入口函数

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_揭开链接器的面纱(上)_第1张图片

7. 自定义程序入口函数

  • gcc提供-e选项用于在链接时指定入口函数
  • 自定义入口函数时必须使用-nostartfiles选项进行链接
#include 
#include 

int program()
{
    printf("jacob2359\n");
    
    exit(0);
}

输入:gcc -e program -nostartfiles program.o -o program.out
输出结果:

jacob2359

声明:此文章为本人在学习狄泰软件学院《十二月提升计划》所做的笔记,参考书籍《专业嵌入式软件开发》——李云,文章中包含狄泰软件资料内容和《专业嵌入式软件开发》资料内容,一切版权归狄泰软件《专业嵌入式软件开发》所有!

你可能感兴趣的:(7_揭开链接器的面纱(上))