标签:des style http color io os ar 使用 sp
本文译至:
http://gcc.gnu.org/onlinedocs/gccint/Initialization.html
如我们所知,在GCC通过给代码追加__attribute__((constructor))和__attribute__((destructor))的方式能够追加初始函数和终止函数,
这篇文章介绍了GCC内部是怎样实现上述处理的。
简单的说,就是在最常常的情况下,初始函数会被追加到.ctor section中,.init会调用相应的函数处理这些初始函数。终止情况类似。
----------------------------------------------------------
为了使用这个变体,你必须正确的定义 INIT_SECTION_ASM_OP 宏。
假设init section不能使用,当GCC编译不论什么名为main的函数时(更精确点,不论什么被expand_main_function指定为程序入口点的函数),它在插入一个函数调用__main做为函数prologue后的第一段运行代码. __main 函数在 libgcc2.c 里被定义并运行全局的构造体。
不支持随意section的文件格式,相同也有两种变体。在最简单的变体里必须用到GNU 链接器(GNU ld)和‘a.out‘ 格式。这样的情况下,TARGET_ASM_CONSTRUCTOR 被定义来生成一个类型为‘N_SETT‘的.stabs入口,參照__CTOR_LIST__, .stabs入口把指向初始化函数代码的void函数地址做为它的值。GNU链接器觉得这是一个把值加到集合的请求;这些值会累积,终于放在可运行文件中做为一个向量,格式如前所述,有一个前导(被忽略)的count和一个末尾的0元素。TARGET_ASM_DESTRUCTOR 处理也类似。既然没有init section可用,缺省的 INIT_SECTION_ASM_OP 使 main 的编译过程会去调用上述的__main函数,開始初始化处理。
最后的变体既不使用随意section也不用GNU 链接器。这在你想要动态链接且文件格式不被 GNU 链接器支持(如 ECOFF )的情况下推荐使用。在这样的情况下,TARGET_HAVE_CTORS_DTORS 是错误的,初始和终止函数简单地通过它们的名称被识别。这个要求在链接阶段的使用一个叫 collect2 的额外程序。这个程序会假扮为链接器被 GCC 使用;它的工作是执行正常的链接器,也管理追加初始函数和终止函数的向量,这些函数通过上述的 __main
被调用。为了使用这种方法,必须在 config.gcc 里的 target 定义use_collect2。
标签:des style http color io os ar 使用 sp
原文地址:http://www.cnblogs.com/yxwkf/p/4031644.html