Oracle® Solaris 11.2 链接程序和库指南

退出打印视图

更新时间: 2014 年 7 月
 
 

符号表布局和约定

按照以下顺序将符号写入符号表。

  • 任何符号表中的索引 0 用于表示未定义的符号。符号表中的第一项始终完全为零。因此符号类型为 STT_NOTYPE

  • 如果符号表包含任何局部符号,符号表中的第二项是提供文件名的 STT_FILE 符号。

  • STT_SECTION 类型的节符号。

  • STT_REGISTER 类型的寄存器符号。

  • 缩减到局部作用域的全局符号。

  • 对于提供局部符号的每个输入文件,提供输入文件名称的 STT_FILE 符号,后跟相关符号。

  • 在符号表中,全局符号紧跟局部符号。第一个全局符号由符号表 sh_info 值标识。局部符号和全局符号始终以这种方式保持彼此独立,不能混合。

这些符号表是 Oracle Solaris OS 中的特殊内容。

.symtab (SHT_SYMTAB)

此符号表包含说明关联的 ELF 文件的每个符号。此符号表通常是不可分配的,因此在进程的内存映像中不可用。

通过使用 mapfileELIMINATE 关键字可以从 .symtab 中消除全局符号。请参见删除符号SYMBOL_SCOPE / SYMBOL_VERSION 指令

.dynsym (SHT_DYNSYM)

此表包含 .symtab 表中支持动态链接所需的符号的子集。此符号表可供分配,因此在进程的内存映像中可用。

.dynsym 表以标准 NULL 符号开始,后跟文件全局符号。STT_FILE 符号通常不包含在此符号表中。如果重定位项需要,可能会包含 STT_SECTION 符号。

.SUNW_ldynsym (SHT_SUNW_LDYNSYM)

扩充 .dynsym 表中包含的信息的可选符号表。.SUNW_ldynsym 表包含局部函数符号。此符号表可供分配,因此在进程的内存映像中可用。当不可分配的 .symtab 不可用或已从文件中剥离时,调试器通过使用此节可在运行时上下文中产生精确的栈跟踪。此节还可以为运行时环境提供其他符号信息,以便与 dladdr(3C) 一起使用。

仅当 .dynsym 表存在时,才存在 .SUNW_ldynsym 表。当 .SUNW_ldynsym 节和 .dynsym 节同时存在时,链接编辑器会将其数据区域紧邻彼此放置,其中 .SUNW_ldynsym 放置在前面。这种放置方式可以使两个表看起来像是一个更大的连续符号表。此符号表遵从先前枚举的标准布局规则。

.SUNW_ldynsym 表可以通过使用链接编辑器的 –z noldynsym 选项进行消除。