Next: , Previous: Initialization, Up: Assembler Format


17.21.6 控制初始化例程的宏

这里是控制编译器如何处理初始化和终止函数的宏:

— Macro: INIT_SECTION_ASM_OP

如果定义,为一个C字符串常量,包括空格, 用于将随后的数据作为初始化代码的汇编操作。如果没有定义, GCC将假设这样的section不存在。当你使用用于初始化和终止函数的特定的section时, 该宏还控制crtstuff.clibgcc2.c如何运行初始化函数。

— Macro: HAS_INIT_SECTION

如果定义,main将不会调用__main。对于控制起始代码, 像OSF/1这样的系统,应该定义该宏, 对于支持INIT_SECTION_ASM_OP的系统不应该显式的定义。

— Macro: LD_INIT_SWITCH

如果定义,为一个C字符串,作为一个开关,告诉连接器后面的符号为一个初始化例程。

— Macro: LD_FINI_SWITCH

如果定义,为一个C字符串常量,作为一个开关,告诉连接器后面的符号为一个结束例程。

— Macro: COLLECT_SHARED_INIT_FUNC (stream, func)

如果定义,为一条C语句,其将写一个在加载共享库时可以被自动调用的函数。 函数应该调用func,其不接受任何参数。如果没有定义, 并且目标格式要求显示的初始化函数,则将会生成一个叫做_GLOBAL__DI的函数。

该函数和下面的一个,被collect2使用,用于连接一个需要构造者或者析构者, 或者代码中具有DWARF2异常表嵌入的共享库的时候。

— Macro: COLLECT_SHARED_FINI_FUNC (stream, func)

如果定义,为一条C语句,其将写一个在卸载共享库时可以被自动调用的函数。 函数应该调用func,其不接受任何参数。如果没有定义, 并且目标格式要求显示的初始化函数,则将会生成一个叫做_GLOBAL__DD的函数。

— Macro: INVOKE__main

如果定义,main将调用__main, 而不管INIT_SECTION_ASM_OP的存在。对于init section不被自动运行, 但是仍可以用于搜集构建者和析构者列表的系统,该宏应该被定义。

— Macro: SUPPORTS_INIT_PRIORITY

如果非零,则支持C++ init_priority属性, 并且编译器应该生成指令来控制对象初始化的顺序。 如果为0,编译器遇到init_priority属性时,将产生一条错误信息。

— Target Hook: bool TARGET_HAVE_CTORS_DTORS

该值为真,如果target支持一些搜集构造者和析构者在起始和退出时运行的本地方法。 如果我们必须使用collect2,则为假。

— Target Hook: void TARGET_ASM_CONSTRUCTOR (rtx symbol, int priority)

如果定义,为一个函数,输出汇编代码来调用在初始化时symbol引用的函数。

假定symbol为一个没有参数并没有返回值的函数的SYMBOL_REF。 如果target支持初始化优先级, priority为一个0到MAX_INIT_PRIORITY之间的值; 否则,其必须为DEFAULT_INIT_PRIORITY

如果该宏没有被taret定义,则一个适当的缺省将被选择, 如果(1)target支持任意section名, (2)target定义了CTORS_SECTION_ASM_OP, 或者(3)没有定义USE_COLLECT2

— Target Hook: void TARGET_ASM_DESTRUCTOR (rtx symbol, int priority)

类似于TARGET_ASM_CONSTRUCTOR,不过用于终止函数,而不是初始化函数。

如果TARGET_HAVE_CTORS_DTORS为真, 对于生成的目标文件的初始化例程将具有静态连接。

如果你的系统使用collec2作为处理构造者的方法, 则那个程序通常使用nm来扫描目标文件,寻找被调用的构造者。

在一些特定的系统上,你可以定义该宏,使得collect2工作的更快。

— Macro: OBJECT_FORMAT_COFF

定义该宏,如果系统使用COFF(Common Object File Format)目标文件, 这样collect2能够假设为该格式,并扫描直接目标文件的构造/析构函数。

该宏只有在本地编译器上才有效率; 对于交叉编译器,collect2总是使用nm

— Macro: REAL_NM_FILE_NAME

定义该宏为一个C字符串常量,包含用来执行nm的文件名。 缺省为搜索通常的路径。

如果你的系统支持共享库,并具有一个程序能够列出给定库或可执行程序的动态依赖, 你可以定义这些宏使得能够运行共享库中的初始化和终止函数。

— Macro: LDD_SUFFIX

定义该宏为一个C字符串常量,包含程序的名字,其可以列出动态依赖, 像SunOS 4中的"ldd"

— Macro: PARSE_LDD_OUTPUT (ptr)

定义该宏为C代码,从LDD_SUFFIX指定的程序的输出中抽取文件名。 ptrchar *类型的变量,指向LDD_SUFFIX的输出中的一行。 如果行中列出的是动态依赖,则代码必须将ptr前进到那一行的文件名起始处。 否则,其必须设置ptrNULL

— Macro: SHLIB_SUFFIX

定义该宏为一个C字符串常量,包含了target缺省的共享库扩展名(例如‘".so"’)。 当生成全局构造者和析构者名字时,collect2从该后缀的后面剥去版本信息。 该定义只在使用collect2来处理构造者和析构者的target上需要。