我知道在 C 中,在应用程序可以开始之前main()
,某些实体必须:
- 初始化全局变量
- 将堆栈指针设置为最低堆栈区域地址(假设堆栈向上增长)
问题 1 - 做这些事情的实体是什么?谁写的?
问题 2-C++ 中还有其他东西吗?
我假设对象构造函数和初始化都是在应用程序过程中完成的,之后main()
很大程度上取决于执行环境。在 C 运行时启动之前,操作系统加载程序可能会完成大量工作,这是可执行文件运行的特定部分。设置执行环境的这个依赖于操作系统的部分对于所有本机(机器语言)可执行文件都是通用的,无论源实现语言如何。
操作系统扮演的角色以及可执行文件中的代码执行的内容因执行环境而异。操作系统加载程序(在非独立系统中)负责将代码加载到内存中,并且可能涉及加载和链接动态链接库(DLL 或共享库,具体取决于操作系统术语)。无论是操作系统还是 C 运行时责任,通常会发生以下情况:
- 堆栈的建立
- 已初始化静态数据的零初始化
- 显式初始化静态数据的初始化
- C 库初始化(通常 stdio 和堆管理需要一些初始化)
- 对于 C++ 调用静态构造函数。
- 创建堆栈帧
main()
(argv
, argc
参数)
例如,在 GCC 和其他一些编译器中,在程序启动之前由程序而不是操作系统执行的部分是由称为crt0.o https://en.wikipedia.org/wiki/Crt0。这通常是用汇编程序编写的,并且默认情况下会自动链接。
有关更多示例和讨论,请参阅:
- Linux x86 程序启动 https://web.archive.org/web/20191210114310/http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html
- 典型的独立嵌入式系统启动 https://www.oreilly.com/library/view/programming-embedded-systems/0596009836/ch04.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)