【发布时间】:2018-09-06 11:19:15
【问题描述】:
我知道从 C 编程语言的角度来看
main()是程序的入口。
但从操作系统的角度来看,__start ctrt0 启动例程被链接到一个程序中,该程序在调用程序的main() 函数之前执行所需的任何初始化工作(如果这里有错误,请纠正我) .
所以我们有一些属性可以用于我们的功能,其中之一是 在main()之前调用的constructor属性,谁负责调用这个函数?
__attribute__((construtor))
void foo(void)
{
puts("Constructor called by ... ?\n");
}
它在逐步调用堆栈中的外观如何?谢谢!
【问题讨论】:
-
只是吹毛求疵:从操作系统的角度来看,符号
__start不是起点。从 链接器脚本 的角度来看,这是起点。然后,链接描述文件将设置链接器,以便在可执行文件的头文件中设置一个特定字段,以包含链接描述文件中提到的任何“开始”函数的地址。 -
这显然不是标准的 C 功能,所以答案应该很清楚。而且它不会改变C程序的入口点。
标签: c gcc compilation