【软件开发底层知识修炼】十 链接器-main函数不是第一个被执行的函数
发布日期:2021-07-01 00:05:34
浏览次数:2
分类:技术文章
本文共 1148 字,大约阅读时间需要 3 分钟。
上一篇文章,大概了解了链接器的工作内容就是:符号解析和重定位。点击上一篇文章查看:。
本片文章其实还是围绕链接器来学习。只不过不是很明显,当你学到下一篇文章时,就明白了。
本篇文章来弄明白一个问题:在C/C++程序被加载到内存中准备运行时,main函数是第一个被执行的函数么?答案肯定不是!如果是,就没必要去写这个文章了!!!
1、_start()函数
先说结果:_start() 是第一个被执行的函数,而不是main()函数。
我们的程序中并没有写_start() ,它是通过链接器链接到可执行文件中的(下一篇文章可以学习到这是如何办到的)。
在默认情况下(gcc)
- 程序加载后,_start()是第一个被执行的函数
- _start()函数,准备好参数后,立即调用 __libc_start_main() 函数
- __libc_start_main() 初始化运行环境后,调用main()函数执行
注意:_start()函数的入口地址就是代码段(.text)的起始地址
2、__libc_start_main()函数的作用
__lib_start_main()函数的作用
- 调用__libc_csu_init()函数(完成必要的初始化操作)
- 启动程序的第一个线程(主线程),main()函数为主线程入口
- 注册__libc_csu_fini()函数(程序运行终止时被调用)
3、程序的启动过程
下面给一个简图,来说明一个C/C++程序的执行过程:
4、自定义程序的入口函数
- gcc 提供
-e
选项,用于在链接时指定入口函数 - 自定义入口函数时,必须使用选项
-nostartfiles
进行链接
比如以下程序:
program.c
#include#include int program(){ printf("D.T.Software\n"); exit(0);}
很明显它没有main函数。但是我们通过以下编译命令进行编译:
- gcc -e program -nostartfiles program.c -o program
生成可执行文件 program
运行该可执行文件: ./program
可以得到运行结果:
显而易见,我们改变了程序的入口函数。虽然没有写main函数,但是依然可以运行该程序!!!
5、总结
本文主要是理解程序的入口函数。最好自己私底下做实验,看一下可执行文件的反汇编代码,就知道整个程序的执行流程了。
本文参考狄泰软件学院相关课程
想学习的可以加狄泰软件学院群, 群聊号码:199546072学习探讨加个人(可以免费帮忙下载CSDN资源):
qq:1126137994 微信:liu1126137994转载地址:https://lyy-0217.blog.csdn.net/article/details/84948322 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2024年05月01日 03时14分47秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
异或^ 的几个作用
2019-05-01
nanomsg编译与测试
2019-05-01
(2)CMake入门笔记--CMake官网教程
2019-05-01
(3)CMake入门笔记--CMake官网教程
2019-05-01
(4)CMake入门笔记--CMake官网教程
2019-05-01
(XWZ)的python学习笔记Ⅰ
2019-05-01
(XWZ)的Python学习笔记Ⅱ------面向对象编程
2019-05-01
(XWZ)的Python学习笔记Ⅲ——面向对象高级编程
2019-05-01
(XWZ)的python学习笔记Ⅳ——错误、调试和测试
2019-05-01
(XWZ)的Python学习笔记Ⅴ——I/O编程
2019-05-01
(XWZ)的python学习笔记Ⅶ——正则表达式
2019-05-01
(XWZ)的Python学习笔记Ⅷ--------numpy
2019-05-01
(XWZ)的python学习笔记——pandas
2019-05-01
基于Frobenius范数的标准NMF更新公式推导
2019-05-01
深度学习第一课——神经网络
2019-05-01
高斯混合模型
2019-05-01
(5)CMake入门笔记--CMake官网教程
2019-05-01
(6)CMake入门笔记--CMake官网教程
2019-05-01
(7)CMake入门笔记--CMake官网教程
2019-05-01
(8)CMake入门笔记--CMake语法
2019-05-01