Next: , Previous: Scheduling, Up: Target Macros


17.19 将输出划分到section中(Texts, Data, ...

目标文件被划分到包含不同类型数据的section中。大多数情况下, 有三个section:text section,存放指令和只读数据;data section, 存放初始化的可写数据;bss section,存放未初始化的数据。 一些系统还具有其它类型的section。

varasm.c提供了一些已知的section,例如text_section, data_sectionbss_section。 通常控制一个foo_section变量的方式是定义一个相关联的 宏FOO_SECTION_ASM_OP,正如下面将要描述的。 宏只在varasm.c初始化时被读一次, 所以它们的值必须为运行时常量。不过它们可以依赖于命令行标记。

注意:一些运行时文件,例如crtstuff.c, 也使用FOO_SECTION_ASM_OP宏,并且将它们作为字符串文字。

一些汇编器要求每次选择section时,都要写入一个不同的字符串。 如果你的汇编器属于这类, 你应该定义TARGET_ASM_INIT_SECTIONS钩子并使用 get_unnamed_section来建立section。

你必须总是创建一个text_section, 或者通过定义TEXT_SECTION_ASM_OP, 或者通过在TARGET_ASM_INIT_SECTIONS中初始化text_section。 同样对于data_sectionDATA_SECTION_ASM_OP。 如果你没有创建一个独立的readonly_data_section, 则缺省使用text_section

所有其他varasm.c section都是可选的,如果target不提供则为null。

— Macro: TEXT_SECTION_ASM_OP

一个C表达式,值为一个字符串,包括空格, 其包含了在指令和只读数据之前的汇编操作。通常为"\t.text"

— Macro: HOT_TEXT_SECTION_NAME

如果定义,则为一个C字符串常量,为包含最频繁被执行的程序的函数的section名字。 如果没有定义,GCC将会提供一个缺省定义,如果target支持命名section。

— Macro: UNLIKELY_EXECUTED_TEXT_SECTION_NAME

如果定义,则为一个C字符串常量,为包含程序中不太可能被执行的函数的section名字。

— Macro: DATA_SECTION_ASM_OP

一个C表达式,值为一个字符串,包括空格, 其包含了标识后续的数据为可写的初始化数据的汇编操作。通常为"\t.data"

— Macro: SDATA_SECTION_ASM_OP

如果定义,则为一个C表达式,值为一个字符串,包括空格, 其包含了标识后续的数据为初始化的,可写的小数据的汇编操作。

— Macro: READONLY_DATA_SECTION_ASM_OP

一个C表达式,值为一个字符串,包括空格, 其包含了标识后续的数据为只读的初始化数据的汇编操作。

— Macro: BSS_SECTION_ASM_OP

如果定义,则为一个C表达式,值为一个字符串,包括空格, 其包含了标识后续的数据为未初始化的,global数据的汇编操作。如果没有定义, 并且ASM_OUTPUT_BSSASM_OUTPUT_ALIGNED_BSS也都没有定义, 则为初始化的global数据将被输出在data section,如果使用了-fno-common, 否则将使用ASM_OUTPUT_COMMON

— Macro: SBSS_SECTION_ASM_OP

如果定义,则为一个C表达式,值为一个字符串,包括空格, 其包含了标识后续的数据为未初始化的,可写的小数据的汇编操作。

— Macro: TLS_COMMON_ASM_OP

If defined, a C expression whose value is a string containing the assembler operation to identify the following data as thread-local common data. The default is ".tls_common".

— Macro: TLS_SECTION_ASM_FLAG

If defined, a C expression whose value is a character constant containing the flag used to mark a section as a TLS section. The default is 'T'.

— Macro: INIT_SECTION_ASM_OP

如果定义,则为一个C表达式,值为一个字符串,包括空格, 其包含了标识后续的数据为初始化代码的汇编操作。如果没有定义, GCC将假设这样的section不存在。该section没有相应的init_section变量; 其完全在运行时代码中使用。

— Macro: FINI_SECTION_ASM_OP

如果定义,则为一个C表达式,值为一个字符串,包括空格, 其包含了标识后续的数据为结束代码的汇编操作。如果没有定义, GCC将假设这样的section不存在。该section没有相应的fini_section变量; 其完全在运行时代码中使用。

— Macro: INIT_ARRAY_SECTION_ASM_OP

如果定义,则为一个C表达式,值为一个字符串,包括空格, 其包含了标识后续的数据为.init_array(或相当的) section的一部分的 汇编操作。如果没有定义,GCC将假设这样的section不存在。 不要同时定义该宏和INIT_SECTION_ASM_OP

— Macro: FINI_ARRAY_SECTION_ASM_OP

如果定义,则为一个C表达式,值为一个字符串,包括空格, 其包含了标识后续的数据为.fini_array(或相当的) section的一部分的 汇编操作。如果没有定义,GCC将假设这样的section不存在。 不要同时定义该宏和FINI_SECTION_ASM_OP

— Macro: CRT_CALL_STATIC_FUNCTION (section_op, function)

如果定义,为一个ASM语句,其通过section_op来切换到不同的section, 调用function,然后切换回到text section。这在crtstuff.c中使用, 如果INIT_SECTION_ASM_OPFINI_SECTION_ASM_OP从init和 fini section中调用初始化和结束函数。缺省下,该宏使用简单的函数调用。 一些port需要手工的代码来避免在函数前奏中对寄存器初始化的依赖, 或者确保常量池在text section中不要结束的太远。

— Macro: TARGET_LIBGCC_SDATA_SECTION

如果定义,则为一个字符串, 其命名了在crtstuff和libgcc中定义的小变量应该存放的section。 这在target具有选项来优化访问小数据的时候很有用。例如, 对于具有.sdata section(像MIPS)的target, 你可以使用-G 0来编译crtstuff,使得其不需要小数据的支持, 但是使用该宏将小数据放到.sdata中, 这样你的应用程序不管是否使用小数据,都可以访问到这些变量。

— Macro: FORCE_CODE_SECTION_ALIGN

如果定义,则为一个ASM语句,其将code section对齐到某个任意的边界。 这用于使得所有.init.fini section的fragment都具有同样的对齐, 这样就可以阻止连接器增加任何padding。

— Macro: JUMP_TABLES_IN_TEXT_SECTION

定义该宏为一个表达式,具有非零值,如果跳转表(对于tablejump insn) 应该被输出到text secton中,以及汇编指令。否则,使用只读data section。

如果没有独立的只读data section,则该宏不相关。

— Target Hook: void TARGET_ASM_INIT_SECTIONS (void)

定义该钩子,如果你需要在建立varasm.c section时做一些特殊的处理, 或者你的target具有一些特殊的section需要创建。

GCC在处理完命令行之后,在写任何汇编代码之前, 并在调用任何下面描述的返回section的钩子之前调用该钩子。

— Target Hook: TARGET_ASM_RELOC_RW_MASK (void)

返回一个掩码,用来描述当选择section时,应该如何对待重定位。 如果全局重定位应该放在读写section中,则应该设置位1; 如果局部重定位应该被放在读写section中,则应该设置位0。

该函数的缺省版本返回3,当-fpic有效时,否则返回0。 当target不支持(某种)在只读section中,甚至在可执行程序中的动态重定位时, 通常会重定义该钩子。

— Target Hook: section * TARGET_ASM_SELECT_SECTION (tree exp, int reloc, unsigned HOST_WIDE_INT align)

返回exp应该被放入的section。 你可以假设expVAR_DECL节点或者一个常量。 reloc指示exp的初始化值是否需要连接时重定位。 当变量只包含局部重定位时位0被设置,对于全局重定位位1被设置。 align为常量对齐位数。

该函数的缺省版本只关心将只读变量放到readonly_data_section中。

参见USE_SELECT_SECTION_FOR_FUNCTIONS.

— Macro: USE_SELECT_SECTION_FOR_FUNCTIONS

如果你希望对于FUNCTION_DECL, 将会调用TARGET_ASM_SELECT_SECTION,则定义该宏。同样对于变量和常量。

对于FUNCTION_DECLreloc将为0,如果函数被确定有可能被调用, 非零如果其不能被调用。

— Target Hook: void TARGET_ASM_UNIQUE_SECTION (tree decl, int reloc)

构建一个唯一的section名,使用STRING_CST节点表示, 并赋值为‘DECL_SECTION_NAME (decl)’。 跟TARGET_ASM_SELECT_SECTION一样, reloc指示exp的初始化值是否需要连接时重定位。

该函数的缺省版本向ELF section名中追加一个符号名。例如, 函数foo将被放在.text.foo中。 这对于实际的target目标格式通常是可以的。

— Target Hook: section * TARGET_ASM_FUNCTION_RODATA_SECTION (tree decl)

返回与‘DECL_SECTION_NAME (decl)’关联的只读data section。 该函数的缺省版本选择.gnu.linkonce.r.name, 如果函数的section为.gnu.linkonce.t.name.rodata.name如果函数在.text.name中, 否则为通常的只读data section。

— Target Hook: section * TARGET_ASM_SELECT_RTX_SECTION (enum machine_mode mode, rtx x, unsigned HOST_WIDE_INT align)

返回具有机器模式mode的常量x应该放入的section。 你可以假设x为RTL形式的某种常量。参数mode除了const_int之外, 是冗余的。align为常量对齐位数。

该函数的缺省版本考虑将符号常量flag_pic模式的,放在data_section中, 其它放在readonly_data_section中。

— Target Hook: void TARGET_MANGLE_DECL_ASSEMBLER_NAME (tree decl, tree id)

定义该钩子,如果你需要处理由target无关的代码生成的汇编名。 提供给该钩子的id将为被计算的名字(例如C中的DECL_NAME宏, 或者C++中的mangled name)。该钩子的返回值为一个IDENTIFIER_NODE。 该钩子的缺省实现只是返回提供的id

— Target Hook: void TARGET_ENCODE_SECTION_INFO (tree decl, rtx rtl, int new_decl_p)

定义该钩子,如果对符号或者常量的引用必须根据符号所命名的变量或者函数来不同处理 (例如其在哪个section中)。

钩子在为decl创建rtl之后立即被执行, decl可能为一个变量或者函数声明,或者常量池的入口。不要在该钩子中 使用DECL_RTL (decl);那个域可能还没有被初始化。

对于常量,可以假设rtl为一个mem,其地址为一个 symbol_ref。 大多数decl将具有这种形式,但不被保证。全局寄存器变量,例如, 它们的rtl将具有一个reg。(对于这样不寻常的rtl通常是将其放在一边)。

参数new_decl_p将为真, 如果这是第一次对于该decl调用TARGET_ENCODE_SECTION_INFO。 对于后续的调用其将为假,这放生在复制的声明中。对于复制声明,是否需要做什么, 取决于钩子是否检查DECL_ATTRIBUTES。当钩子对于常量被调用, 则new_decl_p总为真。

该钩子通常做的事情是记录symbol_ref中的标记, 使用SYMBOL_REF_FLAGSYMBOL_REF_FLAGS

该钩子的缺省定义,varasm.c中的default_encode_section_info, 设置了SYMBOL_REF_FLAGS中通常有用的位。 在覆盖它之前检查缺省代码是否做了你所需要的。

— Target Hook: const char * TARGET_STRIP_NAME_ENCODING (const char *name)

解析name并返回真实的名字部分, 没有TARGET_ENCODE_SECTION_INFO可能加进去的字符。

— Target Hook: bool TARGET_IN_SMALL_DATA_P (const_tree exp)

返回真,如果exp应该被放到“小数据”section中。该钩子的缺省版本总是返回假。

— Variable: Target Hook bool TARGET_HAVE_SRODATA_SECTION

如果target将只读“小数据”放到单独的section中,则包含值为真。缺省值为假。

— Target Hook: bool TARGET_PROFILE_BEFORE_PROLOGUE (void)

It returns true if target wants profile code emitted before prologue.

The default version of this hook use the target macro PROFILE_BEFORE_PROLOGUE.

— Target Hook: bool TARGET_BINDS_LOCAL_P (tree exp)

返回真,如果exp命名了一个对象,其名字解析规则必须

该钩子的缺省版本实现了ELF的名字解析规则, 其具有一个比目前支持的其它目标文件格式较松散的全局名字绑定模型。

— Variable: Target Hook bool TARGET_HAVE_TLS

如果target支持thread-local storage,则包含值为真。缺省值为假。