XCOFF 对象文件格式

用途

扩展公共对象文件格式 (XCOFF) 是操作系统的对象文件格式。 XCOFF 把标准公共目标文件格式(COFF)和 TOC 模块格式概念结合起来,提供在一个目标文件内动态链接和置换单元。 XCOFF 的变体用于 64 位对象文件和可执行文件。

XCOFF 是机器映像对象和可执行文件的正式定义。 这些对象文件由语言处理器 (汇编程序和编译器) 和绑定程序 (或链接编辑器) 生成,并且主要由绑定程序和系统装入程序使用。

XCOFF 可执行文件的缺省名称为 a.out

注: 此信息按大尾数法顺序列出位。

请阅读以下信息以了解有关 XCOFF 对象文件的更多信息:

编写使用 XCOFF 声明的应用程序

可以编写程序以了解 32 位 XCOFF 文件和/或 64 位 XCOFF 文件。 程序本身可以以 32 位方式或 64 位方式编译,以创建 32 位或 64 位程序。 通过定义预处理器宏,应用程序可以从 XCOFF 头文件中选择正确的结构定义。
注: 本文档将 "XCOFF32" 和 "XCOFF64" 分别用作 "32 位 XCOFF" 和 "64 位 XCOFF" 的速记。

选择 XCOFF32 声明

要选择 XCOFF32 定义,应用程序只需要包含相应的头文件。 将仅包含 XCOFF32 结构,字段和预处理器定义。

选择 XCOFF64 声明

要选择 XCOFF64 定义,应用程序应定义预处理器宏 __XCOFF64__。 包含 XCOFF 头文件时,将包含 XCOFF64 的结构,字段和预处理器定义。 在可能的情况下,结构名称和字段名称与 XCOFF32 名称相同,但字段大小和偏移量可能不同。

选择 XCOFF32 和 XCOFF64 声明

要选择 XCOFF32 和 XCOFF64的结构定义,应用程序应同时定义预处理器宏 __XCOFF32____XCOFF64__。 这将定义这两种 XCOFF 文件的结构。 XCOFF64 文件的结构和 typedef 名称将添加后缀 "_64"。 (请参阅头文件以获取详细信息。)

选择混合 XCOFF 声明

应用程序可以选择包含 XCOFF32 和 XCOFF64 文件的字段定义的单个结构。 对于在 XCOFF32 和 XCOFF64 定义中具有相同大小和偏移量的字段,将保留字段名。 对于大小或偏移量在 XCOFF32 和 XCOFF64 定义之间不同的字段, XCOFF32 字段具有 "32" 后缀,而 XCOFF64 字段具有 "64" 后缀。 要选择混合结构定义,应用程序应定义预处理器宏 __X棺材混合 _。 例如,符号表定义 (在 /usr/include/syms.h中) 将具有名称n_offset32用于 XCOFF32的 n_offset 字段以及名称n_offset64用于 XCOFF64的 n_offset 字段。

了解 XCOFF

汇编程序和编译器生成 XCOFF 对象文件作为输出。 绑定程序将各个对象文件组合到 XCOFF 可执行文件中。 系统装入器读取 XCOFF 可执行文件以创建程序的可执行内存映像。 符号调试器读取 XCOFF 可执行文件以提供对可执行内存映像的函数和变量的符号访问。

XCOFF 文件包含以下部分:

  • 由以下部分组成的组合头:
    • 文件头
    • 可选辅助头
    • 部分标题,每个文件的原始数据部分都有一个标题
  • 原始数据部分,每个部分标题最多一个
  • 个别原始数据部分的可选重定位信息
  • 个别原始数据部分的可选行号信息
  • 可选符号表
  • 可选字符串表,用于 XCOFF64 中的所有符号名称以及长度超过 XCOFF32中 8 字节的符号名称。

并非每个 XCOFF 文件都包含每个部件。 最小 XCOFF 文件仅包含文件头。

对象和可执行文件

XCOFF 对象文件和可执行文件在结构上相似。 XCOFF 可执行文件 (或 "模块") 必须包含辅助头,装入程序节头和装入程序节。

装入程序原始数据部分包含将模块动态装入内存以进行执行所需的信息。 将 XCOFF 可执行文件装入内存将创建以下逻辑段:

  • 文本段 (从.text(XCOFF 文件的部分)。
  • 数据段,由已初始化的数据 (从.dataXCOFF 文件的部分) 后跟未初始化的数据 (初始化为 0)。 未初始化数据的长度在.bssXCOFF 文件的节头。

XCOFF 文件组织说明了 XCOFF 对象文件的结构。

XCOFF 头文件

xcoff.h 文件定义 XCOFF 文件的结构。 xcoff.h 文件包含以下文件:

描述
filehdr.h 定义文件头。
aouthdr.h 定义辅助头。
scnhdr.h 定义节标题。
loader.h 定义原始数据的格式.loader部分。
typchk.h 定义原始数据的格式.typchk部分。
exceptab.h 定义原始数据的格式.except部分。
dbug.h 定义原始数据的格式.debug部分。
reloc.h 定义重定位信息。
linenum.h 定义行号信息。
syms.h 定义符号表格式。
storclass.h 定义普通存储类。
dbxstclass.h 定义符号调试器所使用的存储类。

a.out.h 文件包含 xcoff.h 文件。 所有 XCOFF 包含文件都包含 xcoff32_64.h 文件。

有关 XCOFF 对象文件的部分的更多信息,请参阅 "节和节标题" 。 有关符号表的更多信息,请参阅 "符号表信息" 。 有关字符串表的更多信息,请参阅 "字符串表"。 有关 "调试" 部分的更多信息,请参阅 "调试部分"

组合文件头

以下部分描述了 XCOFF 组合文件头组件:

文件头 (filehdr.h)

filehdr.h 文件定义 XCOFF 文件的文件头。 文件头在 XCOFF32 中长度为 20 个字节,在 XCOFF64中长度为 24 个字节。 该结构包含下表中显示的字段。

表 1. 文件头结构 (在 filehdr.h中定义)
字段名称和描述 XCOFF32 XCOFF64
f_magic
目标机器
  • 偏移量: 0
  • 长度: 2
  • 偏移量: 0
  • 长度: 2
f_nscns
节数
  • 偏移量: 2
  • 长度: 2
  • 偏移量: 2
  • 长度: 2
f_timdat
创建文件的时间和日期
  • 偏移量: 4
  • 长度: 4
  • 偏移量: 4
  • 长度: 4
f_symptr+
符号表开始的字节偏移量
  • 偏移量: 8
  • 长度: 4
  • 偏移量: 8
  • 长度: 8
f_nsyms+
符号表中的条目数
  • 偏移量: 12
  • 长度: 4
  • 偏移量: 20
  • 长度: 4
f_opthdr
可选头中的字节数
  • 偏移量: 16
  • 长度: 2
  • 偏移量: 16
  • 长度: 2
f_flags
标志 (请参阅 "字段定义")
  • 偏移量: 18
  • 长度: 2
  • 偏移量: 18
  • 长度: 2
注意:+定义 __X棺材混合 _ 时,请使用 "32" 或 "64" 后缀。

字段定义

描述
f_magic 指定一个称为 magic number的整数,它指定对象文件的目标机器和环境。 对于 XCOFF32,唯一的有效值是0x01DF(0737 Octal)。 对于 XCOFF64 ,唯一有效值为 0x01F7 (0767 Octal)。 这些值的符号名称可在文件 /usr/include/filehdr.h中找到。
f_nscns 指定文件中包含的节标题数。 第一个节标题是第一个节标题; 对节的所有引用都是基于 1 的。
f_timdat 指定创建文件的时间 (自 1970 年 1 月 1 日 00:00:00 全球标准时间 (UCT) 以来经过的秒数)。 此字段应指定实际时间或设置为值 0。
f_symptr 指定文件指针 (从文件开头到符号表开头的字节偏移量)。 如果值f_nsyms字段为 0 ,那么f_nsyms未定义。
f_nsyms 指定符号表中的条目数。 每个符号表项的长度为 18 个字节。
f_opthdr 指定辅助头的长度 (以字节计)。 要使 XCOFF 文件可执行,辅助头必须存在并且长度为 _AOUTHSZ_EXEC 字节。 (_AOUTHSZ_EXECaouthdr.h中定义。)
f_flags 指定用于描述对象文件类型的标志的位掩码。 以下信息定义了标志:
位掩码 (bit mask)
标志
0x0001
F_RELFLG

指示已从文件中除去绑定的重定位信息。 即使不需要重定位信息,也不能由编译器设置此标志。

0x0002
F_EXEC

指示文件可执行。 不存在未解析的外部引用。

0x0004
F_LNNO

指示实用程序已从文件中除去行号。 即使未生成行号信息,编译器也不会设置此标志。

0x0008
已保留。
0x0010
F_FDPR_PROF

指示已使用 fdpr 命令对文件进行概要分析。

0x0020
F_FDPR_OPTI

指示已使用 fdpr 命令对文件进行了重新排序。

0x0040
F_DSA

指示文件使用超大程序支持。

0x0080
已保留。
0x0100

F_VARPG

指示指定介质页大小的辅助头的其中一个成员非零。 缺省情况下,此位的值始终为零。

0x0200
已保留。
0x0400
已保留。
0x0800
已保留。
0x1000
动态加载

指示文件可动态装入且可执行。 通过导入来解析外部引用,该文件可能包含导出和装入程序重定位。

0x2000
_SHROBJ

指示文件是共享对象 (共享库)。 该文件可单独装入。 即,它通常不与其他对象绑定,其装入程序导出符号用作其他对象文件的自动导入符号。

0x4000
F_LOADONLY

如果对象文件是归档的成员,那么系统装入程序可以装入该文件,但绑定程序会忽略该成员。 如果对象文件不在归档中,那么此标志无效。

0x8000
已保留。

辅助头 (aouthdr.h)

辅助头包含与系统相关和与实现相关的信息,这些信息用于装入和执行模块。 辅助头中的信息使系统装入程序在执行时必须处理的文件量最小化。

绑定程序生成辅助头以供系统装入程序使用。 对于不需要装入的对象文件,不需要辅助头。 当编译器和汇编程序生成辅助头时,绑定程序将忽略这些头。

辅助头紧跟在文件头之后。
注: 如果f_opthdr文件头中的字段为 0 ,辅助头不存在。

辅助头的 C 语言结构在 aouthdr.h 文件中定义。 辅助头包含下表中显示的字段。

表 2。 辅助头结构 (在 aouthdr.h中定义)
字段名称和描述 XCOFF32 XCOFF64
o_mflag
标志
  • 偏移量: 0
  • 长度: 2
  • 偏移量: 0
  • 长度: 2
o_vstamp
版本
  • 偏移量: 2
  • 长度: 2
  • 偏移量: 2
  • 长度: 2
o_tsize+
文本大小 (以字节计)
  • 偏移量: 4
  • 长度: 4
  • 偏移量: 56
  • 长度: 8
o_dsize+
已初始化的数据大小 (以字节计)
  • 偏移量: 8
  • 长度: 4
  • 偏移量: 64
  • 长度: 8
o_bsize+
未初始化的数据大小 (以字节计)
  • 偏移量: 12
  • 长度: 4
  • 偏移量: 72
  • 长度: 8
o_entry+
入口点描述符 (虚拟地址)
  • 偏移量: 16
  • 长度: 4
  • 偏移量: 80
  • 长度: 8
o_text_start+
文本的基本地址 (虚拟地址)
  • 偏移量: 20
  • 长度: 4
  • 偏移量: 8
  • 长度: 8
o_data_start+
数据的基本地址 (虚拟地址)
  • 偏移量: 24
  • 长度: 4
  • 偏移量: 16
  • 长度: 8
o_toc+
TOC 锚点的地址
  • 偏移量: 28
  • 长度: 4
  • 偏移量: 24
  • 长度: 8
o_snentry
入口点的节号
  • 偏移量: 32
  • 长度: 2
  • 偏移量: 32
  • 长度: 2
o_sntext
.text 的节号
  • 偏移量: 34
  • 长度: 2
  • 偏移量: 34
  • 长度: 2
o_sndata
.data 的节号
  • 偏移量: 36
  • 长度: 2
  • 偏移量: 36
  • 长度: 2
o_sntoc
TOC 的节号
  • 偏移量: 38
  • 长度: 2
  • 偏移量: 38
  • 长度: 2
o_snloader
装入程序数据的节号
  • 偏移量: 40
  • 长度: 2
  • 偏移量: 40
  • 长度: 2
o_snbss
.bss 的节号
  • 偏移量: 42
  • 长度: 2
  • 偏移量: 42
  • 长度: 2
o_algntext
.text 的最大对齐方式
  • 偏移量: 44
  • 长度: 2
  • 偏移量: 44
  • 长度: 2
o_algndata
.data 的最大对齐方式
  • 偏移量: 46
  • 长度: 2
  • 偏移量: 46
  • 长度: 2
o_modtype
模块类型字段
  • 偏移量: 48
  • 长度: 2
  • 偏移量: 48
  • 长度: 2
o_cpuflag
位标志-对象的 cpu 类型
  • 偏移量: 50
  • 长度: 1
  • 偏移量: 50
  • 长度: 1
o_cputype
为 CPU 类型保留
  • 偏移量: 51
  • 长度: 1
  • 偏移量: 51
  • 长度: 1
o_maxstack+
允许的最大堆栈大小 (字节)
  • 偏移量: 52
  • 长度: 4
  • 偏移量: 88
  • 长度: 8
o_maxdata+
允许的最大数据大小 (字节)
  • 偏移量: 56
  • 长度: 4
  • 抵销: 96
  • 长度: 8
o_debugger+
为调试器保留。
  • 偏移量: 60
  • 长度: 4
  • 偏移量: 4
  • 长度: 4
o_textpsize+
请求的文本页面大小。
  • 偏移量: 64
  • 长度: 1
  • 偏移量: 52
  • 长度: 1
o_datapsize+
请求的数据页大小。
  • 偏移量: 65
  • 长度: 1
  • 偏移量: 53
  • 长度: 1
o_stackpsize+
请求的堆栈页大小。
  • 偏移量: 66
  • 长度: 1
  • 偏移量: 54
  • 长度: 1
o_flags
标志和线程-本地存储器对齐
  • 抵销: 67
  • 长度: 1
  • 抵销: 55
  • 长度: 1
o_sntdata
.tdata 的节号
  • 抵销: 68
  • 长度: 2
  • 偏移量: 104
  • 长度: 2
o_sntbss
.tbss 的节号
  • 偏移量: 70
  • 长度: 2
  • 偏移量: 106
  • 长度: 2
o_x64flags
XCOFF64 标志
  • 偏移量: 不适用
  • 长度: 不适用
  • 偏移量: 108
  • 长度: 2
o_shmpsize+
请求的共享内存页面大小
  • 偏移量: 不适用
  • 长度: 不适用
  • 偏移量: 110
  • 长度: 1
注意:+定义 __X棺材混合 _ 时,请使用 "32" 或 "64" 后缀。

字段定义

以下信息定义辅助头字段。 对于具有两个标签的条目,括号中的标签是备用原始 COFF a.out 文件格式名称。

描述
o_mflags (magic) 如果值o_vstamp字段大于 1 ,o_mflags字段保留以供将来使用,并且应该包含 0。 否则,将不使用此字段。
o_vstamp (vstamp) 指定此辅助头的格式版本。 有效值为 1 和 2。 如果在请求中未找到o_vstamp字段在 XCOFF32 文件中为 2 ,这是对n_type使用符号表项中的字段。
o_tsize (tsize) 指定以下对象的原始数据大小 (以字节计):.text部分。 该.text部分通常包含程序的只读部分。 此值与以下内容中包含的值相同:s_size段标题的字段.text部分。
o_dsize (dsize) 指定以下对象的原始数据大小 (以字节计):.data部分。 该.data部分包含程序的初始化数据,并且可写。 此值与以下内容中包含的值相同:s_size段标题的字段.data部分。
o_bsize (bsize) 指定以下对象的大小 (以字节计):.bss区域,用于执行期间未初始化的变量,并且可写。 文件中不存在.bss部分。 此值与以下内容中包含的值相同:s_size段标题的字段.bss部分。
o_entry (entry) 指定入口点的虚拟地址。 (见定义o_snentry字段。) 对于应用程序,此虚拟地址是函数描述符的地址。 函数描述符包含入口点本身及其 TOC 锚点的地址。 入口点函数描述符从其包含部分开始的偏移可以计算如下:
Section_offset_value=o_entry-s_paddr[o_snentry - 1],

其中s_paddr是所指定节头中包含的虚拟地址。

o_text_start (text_start) 指定 .text 部分的虚拟地址。 这是分配给 (即,用于) 第一个字节的地址.text原始数据部分。 此值与以下内容中包含的值相同:s_paddr段标题的字段.text部分。
o_data_start (data_start) 指定.data部分。 这是分配给 (即,用于) 第一个字节的地址.data原始数据部分。 此值与以下内容中包含的值相同:s_paddr段标题的字段.data部分。

为解决此问题,.bss部分被视为遵循.data部分。

o_toc 指定 TOC 锚点的虚拟地址 (请参阅o_sntoc字段)。
o_snentry 指定包含入口点的文件部分的编号。 (此字段包含文件节标题序号。) 入口点必须在.text.data部分。
o_sntext 指定文件的编号.text部分。 (此字段包含文件节标题序号。)
o_sndata 指定文件的编号.data部分。 (此字段包含文件节标题序号。)
o_sntoc 指定包含 TOC 的文件部分的编号。 (此字段包含文件节标题序号。)
o_snloader 指定包含系统装入程序信息的文件部分的编号。 (此字段包含文件节标题序号。)
o_snbss 指定文件的编号.bss部分。 (此字段包含文件节标题序号。)
o_algntext 指定任何 csect 需要的最大对齐的日志 (基本 2).text部分。
o_algndata 指定任何 csect 需要的最大对齐的日志 (基本 2).data.bss部分。
o_modtype 指定模块类型。 该值是 ASCII 字符串。 系统装入程序可识别以下模块类型:
RO
指定只读模块。 如果具有此模块类型的共享对象没有 BSS 部分,并且仅依赖于其他只读模块,那么该模块的数据部分将以只读方式映射,并由使用该对象的所有进程共享。
o_cpuflag 位标志-对象的 cputype。
o_cputype 已保留。 此字节必须设置为 0。
o_maxstack 指定此可执行文件允许的最大堆栈大小 (以字节计)。 如果值为 0 ,那么将使用系统缺省最大堆栈大小。
o_maxdata 指定此可执行文件允许的最大数据大小 (以字节计)。 如果值为 0 ,那么将使用系统缺省最大数据大小。
o_debugger 此字段应包含 0。 当正在调试已装入的程序时,此字段的内存映像可由调试器修改以插入陷阱指令。
o_sntdata 指定.tdata文件部分。 (此字段包含文件节标题序号。)
o_sntbss 指定.tbss文件部分。 (此字段包含文件节标题序号。)
o_flags 由四个 1 位标志和一个 4 位标志组成.tdata对齐:
_AOUT_TLS_LE 0x80 (高阶位o_flags)
程序将 local-exec 模型用于线程本地存储器。 无法动态装入此类程序。
_AOUT_RAS 0x40
指示内核扩展是密钥和恢复安全的。
_AOUT_ALGNTDATA (低阶 4 位o_flags)
此字段指定模块的线程本地存储器的期望对齐。 此 4 位数字的值解释如下:
Bit 0-8    Log (base 2) of desired alignment
Bit 9-11   Reserved.
Bit 12     4KB page alignment 
Bit 13     64KB page alignment 
Bit 14-15  Reserved.
o_textpsize 指定 exec 文本的页面大小。 缺省值为 0 (系统选择的页面大小)。
o_datapsize 指定 exec 数据的页面大小。 缺省值为 0 (系统选择的页面大小)。 值o_datapsize覆盖大页面数据请求 (通过在 XCOFF 文件中设置 F_LPDATA 位)。
o_stackpsize 指定堆栈的页面大小。 缺省值为 0 (系统选择的页面大小)。
o_shmpsize64 指定exec共享内存。 缺省值为 0 (系统选择的页面大小)。 此字段仅存在于 XCOFF64 定义中。
o_x64flags 由 16 个标志位组成。 此字段仅存在于 XCOFF64 定义中。
_AOUT_SHR_SYMTAB 0x8000
请求为此程序创建共享符号表,此程序由系统上程序的所有实例使用。 在共享库中忽略此标志。
_AOUT_分叉策略 0x4000
如果设置了 _AOUT_FORK_POLICY 标志,那么将请求一个探索 forktree 策略。 _AOUT_FORK_COR 标志确定请求哪个策略。 在共享库中忽略此标志。
_AOUT_FORK_COR 0x2000
如果同时设置了 _AOUT_FORK_POLICY_AOUT_FORK_COR 标志,那么将请求复制引用 forktree 策略。 如果设置了 A_OUT_FORK_POLICY 标志,但未设置 _AOUT_FORK_COR 标志,那么将请求写入时复制 forktree 策略。

如果未设置 _AOUT_FORK_POLICY ,那么将保留 _AOUT_FORK_COR 标志以供将来使用,并且应该设置为 0。 在共享库中忽略此标志。

通常,对象文件可能包含给定类型的多个部分,但在可装入模块中,必须正好有一个.text,.data,.bss.loader部分。 可装入对象可能还具有一个.tdata部分和一个.tbss部分。

节标题 (scnhdr.h)

XCOFF 文件的每个部分都具有相应的部分标题,尽管某些部分标题可能没有相应的原始数据部分。 节头为 XCOFF 文件中包含的每个节提供标识和文件访问信息。 XCOFF32 文件中的每个节头的长度为 40 个字节,而 XCOFF64 节头的长度为 72 个字节。 可以在 scnhdr.h 文件中找到节头的 C 语言结构。 节标题包含下表中显示的字段。

表 3。 部分标题结构 (在 scnhdr.h中定义)
字段名称和描述 XCOFF32 XCOFF64
s_name
部分名称
  • 偏移量: 0
  • 长度: 8
  • 偏移量: 0
  • 长度: 8
s_paddr+
物理地址
  • 偏移量: 8
  • 长度: 4
  • 偏移量: 8
  • 长度: 8
s_vaddr+
虚拟地址 (与物理地址相同)
  • 偏移量: 12
  • 长度: 4
  • 偏移量: 16
  • 长度: 8
s_size+
区段大小
  • 偏移量: 16
  • 长度: 4
  • 偏移量: 24
  • 长度: 8
s_scnptr+
文件中与部分的原始数据的偏移量
  • 偏移量: 20
  • 长度: 4
  • 偏移量: 32
  • 长度: 8
s_relptr+
部分的文件到重定位条目的偏移量
  • 偏移量: 24
  • 长度: 4
  • 偏移量: 40
  • 长度: 8
s_lnnoptr+
部分的文件到行号条目的偏移量
  • 偏移量: 28
  • 长度: 4
  • 偏移量: 48
  • 长度: 8
s_nreloc+
重定位条目数
  • 偏移量: 32
  • 长度: 2
  • 偏移量: 56
  • 长度: 4
s_nlnno+
行号条目数
  • 偏移量: 34
  • 长度: 2
  • 偏移量: 60
  • 长度: 4
s_flags+
用于定义节类型的标志
  • 偏移量: 36
  • 长度: 2
  • 偏移量: 64
  • 长度: 4
注意:+定义 __X棺材混合 _ 时,请使用 "32" 或 "64" 后缀。

字段定义

以下信息定义了节标题字段:

描述
s_name 指定 8 字节的空填充节名称。 8 字节的节名称将不具有终止空字符。 使用s_flags字段而不是s_name用于确定区段类型的字段。 同一类型的两个部分可能具有不同的名称,允许某些应用程序区分它们。
s_paddr 指定部分的物理地址。 这是编译器和绑定程序为节的第一个字节分配和使用的地址。 此字段应包含除以下部分以外的所有部分的 0:.text,.data.bss部分。
s_vaddr 指定部分的虚拟地址。 此字段的值与s_paddr
s_size 指定此部分的大小 (以字节计)。
s_scnptr 指定指向此部分原始数据的文件指针 (从文件开头开始的字节偏移)。 如果此字段包含 0 ,那么此部分没有原始数据。 否则,原始数据的大小必须包含在s_size
s_relptr 指定指向此部分的重定位项的文件指针 (从文件开头开始的字节偏移量)。 如果此部分没有重定位条目,那么此字段必须包含 0。
s_lnnoptr 指定指向此部分的行号条目的文件指针 (从文件开头开始的字节偏移量)。 如果此部分没有行号条目,那么此字段必须包含 0。
s_nreloc 指定此部分的重定位项数。 在 XCOFF32 文件中,如果需要超过 65,534 个重定位条目,那么字段值将为 65535 ,并且 STYP_OVRFLO 节头将包含s_paddr。 请参阅 "节和节标题" 中有关溢出头的讨论。 如果此字段设置为 65535 ,那么s_nlnno字段也必须设置为 65535。
s_nlnno 指定此部分的行号条目数。 在 XCOFF32 文件中,如果需要超过 65,534 个行号条目,那么字段值将为 65535 ,并且 STYP_OVRFLO 节头将包含在s_vaddr。 请参阅 "节和节标题" 中有关溢出头的讨论。 如果此字段设置为 65535 ,那么s_nreloc字段也必须设置为 65535。
s_flags 指定定义节类型的标志。 节类型标识节的内容,并指定系统装入程序的绑定程序如何处理节。 s_flags 字段由两个 16 位字段组成。 低阶 16 位指定主节类型。 只有一个位应该设置在低阶 16 位中。 高位 16 位指定节子类型。 对于没有子类型的主节类型,高位 16 位应该是 0。
注意: strip命令通过将s_flags 字段设置为-1,从逻辑上删除了段头。

有效的位值为:

标志
0x0000
已保留。
0x0001
已保留。
0x0002
已保留。
0x0004
已保留。
0x0008
STYP_PAD

指定填充部分。 此类型的部分用于在 XCOFF 可执行对象文件中的部分之间提供对齐填充。 此节头类型已过时,因为在没有相应 pad 节头的 XCOFF 文件中允许填充。

0x0010
STYP_侏儒

指定 DWARF 调试部分,该部分为符号调试器提供源文件和符号信息。

定义了多种类型的 DWARF 部分。 DWARF 部分的类型是使用 s_flags 字段的高阶 16 位指定的。 有效子类型为:

     Value   |     Macro	      | Description
		-----------------------------------------------
		0x10000  | SSUBTYP_DWINFO   | DWARF info section
		0x20000  | SSUBTYP_DWLINE   | DWARF line-number section
		0x30000  | SSUBTYP_DWPBNMS  | DWARF public names section
		0x40000  | SSUBTYP_DWPBTYP  | DWARF public types section
		0x50000  | SSUBTYP_DWARNGE  | DWARF aranges section
		0x60000  | SSUBTYP_DWABREV  | DWARF abbreviation section
		0x70000  | SSUBTYP_DWSTR    | DWARF strings section
		0x80000  | SSUBTYP_DWRNGES  | DWARF ranges section
    0x90000  | SSUBTYPE_DWLOC   | DWARF location lists section
		0xA0000  | SSUBTYPE_DWFRAME | DWARF frames section
	  0xB0000  | SSUBTYPE_DWMAC   | DWARF macros section
0x0020
STYP_TEXT

指定可执行文本 (代码) 部分。 此类型的部分包含程序的可执行指令。

0x0040
STYP_DATA

指定已初始化的数据部分。 此类型的部分包含程序的已初始化数据和 TOC。

0x0080
STYP_BSS

指定未初始化的数据部分。 此类型的节头定义程序的未初始化数据。

0x0100
STYP_EXCEPT

指定异常部分。 此类型的部分提供信息以确定在可执行对象程序中发生陷阱或异常的原因。

描述
 
0x0200
STYP_INFO

指定注释部分。 此类型的部分向特殊处理实用程序提供注释或数据。

0x0400
STYP_TDATA

指定已初始化的线程本地数据部分。

0x0800
STYP_TBSS

指定未初始化的线程本地数据部分。

s_flags持续

有效的位值为:

标志
0x1000
STYP_加载器

指定装入程序部分。 此类型的部分包含供系统装入程序装入 XCOFF 可执行文件的对象文件信息。 这些信息包括导入的符号,导出的符号,重定位数据,类型检查信息和共享对象名。

0x2000
STYP_调试

指定调试部分。 此类型的部分包含符号调试器所使用的 stabstring 信息。

0x4000
STYP_TYPCHK

指定类型检查部分。 此类型的部分包含参数/参数类型-绑定程序使用的检查字符串。

0x8000
STYP_OVRFLO
注: XCOFF64 文件可能不包含溢出节头。

指定重定位或行号字段溢出部分。 此类型的节标题包含某些其他节的重定位项和行号项的计数。 当任一计数超过 65,534 时,都需要此节标题。 请参阅s_nrelocs_nlnno"部分和部分标题" 中的字段,以获取有关溢出标题的更多信息。

节和节标题

定义了节标题以提供有关 XCOFF 文件内容的各种信息。 处理 XCOFF 文件的程序将仅识别某些有效部分。

请参阅以下信息以了解有关 XCOFF 文件部分的更多信息:

当前应用程序不使用s_name字段以确定区段类型。 然而,传统名称由系统工具使用,如下表所示。

表 4。 常规头名称
描述 允许多个? s_flag (及其传统名称)
文本部分 Yes STYP_TEXT (.text)
数据部分 Yes STYP_DATA (.data)
BSS 部分 Yes STYP_BSS (.bss)
Pad 部分 Yes STYP_PAD (.pad)
装入程序节 No STYP_LOADER (.loader)
"调试" 部分 No STYP_DEBUG (.debug)
"类型-检查" 部分 Yes STYP_TYPCHK (.typchk)
"异常" 部分 No STYP_EXCEPT (.except)
溢出部分 Yes(每.text.data部分) STYP_OVRFLO (.ovrflo)
"注释" 部分 Yes STYP_INFO (.info)
Tdata 部分 Yes STYP_TDATA (.tdata)
TBSS 部分 Yes STYP_TBSS (.tbss)
DWARF 部分 Yes STYP_侏儒
    SSUBTYPE_DWINFO (.dwinfo)
    SSUBTYPE_DWLINE (.dwline)
    SSUBTYPE_DWPBNMS (.dwpbnms)
    SSUBTYPE_DWBTYP (.dwpbtyp)
    SSUBTYPE_DWARNGE (.dwarnge)
    SSUBTYPE_DWABREV (.dwabrev)
    SSUBTYPE_DWSTR (.dwstr)
    SSUBTYPE_DWRNGES (.dwrnges)
    SSUBTYPE_DWLOC (.dwloc)
    SSUBTYPE_DWFRAME(.dwframe)
    SSUBTYPE_DWMAC (.dwmac)

部分标题的某些字段可能并非总是被使用,或者可能有特殊用法。 这与以下字段相关:

描述
s_name 在输入时,由绑定程序和系统装入程序忽略。 在输出时,将使用常规名称 (如 "常规头名称" 表中所示)。
s_scnptr 已忽略.bss部分。
s_relptr 认可.text ,.data ,.tdata以及仅 STYP_DWARF 部分。
s_lnnoptr 认可.text仅部分。 否则,它必须是 0。
s_nreloc,s_nlnno 处理 XCOFF32 文件中的重定位或行号字段溢出。 (XCOFF64 文件可能没有溢出节头。) 如果部分具有超过 65,534 个重定位条目或行号条目,那么这两个字段都将设置为值65535. 在本例中,溢出段头与s_flags等于 STYP_OVRFLO 的字段用于包含重定位和行号计数信息。 溢出部分标题中的字段定义如下:
s_nreloc
指定溢出的节头的文件节号; 即,包含值的节头65535在它的s_nrelocs_nlnno字段。 此值提供对主节标题的引用。 此字段的值必须与s_nlnno
注: 主节标题中没有用于标识相应溢出节标题的引用。 必须搜索所有节头以找到包含此字段中正确的主节头引用的溢出节头。
s_nlnno
指定溢出的节头的文件节号。 此字段的值必须与s_nreloc
s_paddr
指定实际需要的重定位项数。 将使用此字段来代替s_nreloc溢出的节标题的字段。
s_vaddr
指定实际需要的行号项数。 将使用此字段来代替s_nlnno溢出的节标题的字段。

s_sizes_scnptr在溢出部分头中,字段的值为 0。 该s_relptrs_lnnoptr字段的值必须与相应的主节标题中的值相同。

XCOFF 文件提供了以下部分的特殊含义:

  • .text,.data.bss部分,以及可选的.tdata.tbss段,定义程序的内存映像。 与之关联的重定位部件.text.data部分包含完整的绑定程序重定位信息,因此可用于替换链接编辑。 只有.text部分与行号部分关联。 与可执行代码关联的部件由编译器和汇编程序生成。
  • .pad段定义为空填充的原始数据段,用于在某些定义的边界 (例如文件块边界或系统页边界) 上对齐文件中的后续段。 在没有相应节头的 XCOFF 文件中允许填充,以便绑定程序不会生成 pad 节头。
  • .loader部分是定义为包含动态装入程序信息的原始数据部分。 此部分由绑定程序生成,并具有自己的自包含符号表和重定位表。 XCOFF 符号表中没有对此部分的引用。
  • .debugsection 是定义为包含符号调试器所需的 stab (符号表) 或字典信息的原始数据部分。
  • .dwinfo,.dwline,.dwpbnms,.dwpbtyp,.dwarnge,.dwabrev,.dwstr,.dwrnges段是定义为包含符号调试器的符号表和源文件信息的原始数据段。
  • .typchksection 是定义为包含参数和自变量类型检查字符串的原始数据部分。
  • .exceptsection 是一个原始数据部分,定义为包含用于标识程序执行中异常原因的异常表。
  • .info注释部分是定义为包含对特殊处理实用程序有意义的注释或数据的原始数据部分。
  • .debug,.except,.info.typchk部分由编译器和汇编程序生成。 对这些部分或这些部分中的项的引用来自 XCOFF 符号表。

有关 XCOFF 文件部分的更多信息,请参阅 "装入程序部分 (loader.h) ," "调试部分," "类型-检查部分," "异常部分," "注释部分"

装入程序部分 (loader.h)

装入程序部分包含系统装入程序装入和重定位可执行 XCOFF 对象所需的信息。 装入器部分由绑定程序生成。 装入程序部分具有s_flagsXCOFF 节头中 STYP_LOADER 的节类型标志。 按照惯例.loader是装入程序部分名称。 此部分中的数据未由 XCOFF 符号表中的条目引用。

装入程序部分由以下部分组成:

  • 标题字段
  • 符号表
  • 重定位表
  • 导入文件标识字符串
  • 符号名称字符串表

可以在 loader.h 文件中找到装入程序部分的 C 语言结构。

装入程序头字段定义

下表描述了装入程序部分的头字段定义。

表 5。 装入程序部分标题结构 (在 loader.h中定义)
字段名称和描述 XCOFF32 XCOFF64
l_version
装入程序部分版本号
  • 偏移量: 0
  • 长度: 4
  • 偏移量: 0
  • 长度: 4
l_nsyms
符号表条目数
  • 偏移量: 4
  • 长度: 4
  • 偏移量: 4
  • 长度: 4
l_nreloc
重定位表条目数
  • 偏移量: 8
  • 长度: 4
  • 偏移量: 8
  • 长度: 4
l_istlen
导入文件标识字符串表的长度
  • 偏移量: 12
  • 长度: 4
  • 偏移量: 12
  • 长度: 4
l_nimpid
导入文件标识数
  • 偏移量: 16
  • 长度: 4
  • 偏移量: 16
  • 长度: 4
l_impoff+
开始导入文件标识的偏移量
  • 偏移量: 20
  • 长度: 4
  • 偏移量: 24
  • 长度: 8
l_stlen+
字符串表的长度
  • 偏移量: 24
  • 长度: 4
  • 偏移量: 20
  • 长度: 4
l_stoff+
用于启动字符串表的偏移量
  • 偏移量: 28
  • 长度: 4
  • 偏移量: 32
  • 长度: 8
l_symoff
符号表开始时的偏移量
  • 偏移量: 不适用
  • 长度: 不适用
  • 偏移量: 40
  • 长度: 8
l_rl多夫
开始重定位条目的偏移量
  • 偏移量: 不适用
  • 长度: 不适用
  • 偏移量: 48
  • 长度: 8
注意:+定义 __X棺材混合 _ 时,请使用 "32" 或 "64" 后缀。

以下信息定义装入程序部分的头字段:

描述
l_version 指定装入程序部分版本号。 XCOFF32; , XCOFF64支持值 1 或 2。
l_nsyms 指定装入程序部分中的符号表项数。 此值是装入程序部分中包含的符号表条目的实际计数,不包括 .text.data.bss.tdata.tbss 符号条目的五个隐式条目。
l_nreloc 指定装入程序部分中的重定位表项数。
l_istlen 指定装入程序部分中导入文件标识字符串表的字节长度。
l_nimpid 指定导入文件标识字符串表中的导入文件标识数。
l_impoff 指定从装入程序部分开始到第一个导入文件标识的字节偏移量。
l_stlen 指定装入程序部分字符串表的长度。
l_stoff 指定从装入程序部分开始到字符串表中第一个条目的字节偏移量。
l_symoff 指定从装入程序部分开始到装入程序符号表开始的字节偏移量 (仅在 XCOFF64 中)。 在 XCOFF32中,符号表跟在装入程序头之后。
l_rldoff 指定从装入程序部分开始到装入程序部分重定位项开始的字节偏移量 (仅在 XCOFF64 中)。 在 XCOFF32中,重定位条目紧跟在装入程序符号表之后。

装入程序符号表字段定义

装入程序部分符号表包含系统装入程序进行其导入和导出符号处理以及动态重定位处理所需的符号表条目。

loader.h 文件定义符号表字段。 每个条目的长度为 24 个字节。

有五个隐式外部符号,每个符号一个.text,.data,.bss,.tdata.tbss部分。 这些符号分别使用符号表索引值 0、1、2、-1 和-2 从重置表项中引用。

表 6。 装入程序部分符号表条目结构
字段名称和描述 XCOFF32 XCOFF64
l_name+
字符串表中的符号名称或字节偏移量
  • 偏移量: 0
  • 长度: 8
  • 偏移量: 不适用
  • 长度: 不适用
l_zeroes+
零指示从 l_offset 引用符号名称
  • 偏移量: 0
  • 长度: 4
  • 偏移量: 不适用
  • 长度: 不适用
l_offset+
符号名称的字符串表中的字节偏移量
  • 偏移量: 4
  • 长度: 4
  • 偏移量: 8
  • 长度: 4
l_value+
地址字段
  • 偏移量: 8
  • 长度: 4
  • 偏移量: 0
  • 长度: 8
l_scnum
包含符号的节号
  • 偏移量: 12
  • 长度: 2
  • 偏移量: 12
  • 长度: 2
l_smtype
符号类型,导出,导入标志
  • 偏移量: 14
  • 长度: 1
  • 偏移量: 14
  • 长度: 1
l_smclas
符号存储类
  • 偏移量: 15
  • 长度: 1
  • 偏移量: 15
  • 长度: 1
l_ifile
导入文件标识; 导入文件标识的顺序
  • 偏移量: 16
  • 长度: 4
  • 偏移量: 16
  • 长度: 4
l_parm
参数类型-检查字段
  • Offset:20
  • 长度: 4
  • 偏移量: 20
  • 长度: 4
注意:+定义 __X棺材混合 _ 时,请使用 "32" 或 "64" 后缀。

符号表字段为:

描述
l_name (仅XCOFF32 ) 指定长度为 8 字节或更小的 8 字节空填充符号名称。 否则,该字段将被视为用于访问符号名称的以下两个 4 字节整数:
l_zeroes
(仅适用于XCOFF32 ) 值 0 指示符号名称在装入程序部分字符串表中。 这个字段覆盖了第一个词l_name。 :NONE.l_name前 4 字节 (第一个字) 等于 0 的字段用于指示名称字符串包含在字符串表中,而不是l_name
l_offset
(仅限XCOFF32 ) 此字段覆盖l_name。 此字段的值是从装入程序段字符串表开头到符号名称的第一个字节 (而不是其长度字段) 的字节偏移量。
l_offset (仅限XCOFF64 ) 此字段与l_offsetXCOFF32中的字段。
l_value 指定符号的虚拟地址
l_scnum 指定包含符号的 XCOFF 节的编号。 如果未定义或导入符号,那么节号为 0。 否则,节号指.text,.data,或.bss部分。 节标题以 1 开头进行编号。
l_smtype 指定符号类型,导入标志,导出标志和输入标志。

位 0-4 是如下定义的标志位:

Bit 0     0x80  Reserved.
Bit 1     0x40  Specifies an imported symbol.
Bit 2     0x20  Specifies an entry point descriptor symbol.
Bit 3     0x10  Specifies an exported symbol.
Bit 4     0x08  Specifies a weak symbol.
Bits 5-7  0x07 Symbol type--see below.

位 5-7 构成具有以下定义的 3 位符号类型字段:

0
XTY_ER

指定外部引用,为另一个 XCOFF 对象文件中包含的外部 (全局) 符号提供符号表条目。

1
XTY_SD

指定 csect 节定义,提供 XCOFF 对象文件中最小初始化单元的定义。

2
XTY_LD

指定标签定义,为已初始化的 csects 提供全局入口点的定义。 类型为 XTY_CM 的未初始化 csect 可能不包含标签定义。

3
XTY_CM

指定公共 (BSS 未初始化数据) csect 定义,提供 XCOFF 对象文件中最小未初始化单元的定义。

4-7
已保留。
l_smclas
指定符号的存储映射类,如 syms.h 中针对x_smclascsect 辅助符号表项的字段。 值具有符号格式 XMC_xx,其中 xx 是 PR , RO , GL , XO , SV , SV64, SV3264, RW , TC , TD , DS , UA , BS , UC , TL 或 UL。 有关更多信息,请参阅 "csect 辅助条目 for the C_EXT , C WIDEXTC_HIDEXT 符号"
l_ifile
指定导入文件标识字符串。 此整数是导入文件标识字符串在装入程序部分的导入文件标识名称字符串表中的位置的有序值。 对于导入的符号,此字段中 0 的值将该符号标识为延迟导入到系统装入程序。 延迟导入是一个符号,在处理装入程序之后,其地址可以保持未解析状态。 如果未导入符号,那么此字段的值必须为 0。
l_parm
指定参数类型检查字符串的偏移量。 字节偏移量来自装入程序部分字符串表的开头。 字节偏移量指向参数类型检查字符串的第一个字节 (而不是其长度字段)。 有关参数 type-check 字符串的更多信息,请参阅 "Type-Check Section" 。 0 的值l_parm字段指示此符号不存在参数类型检查字符串,并且该符号将被视为具有通用散列。

装入程序重定位表字段定义

装入程序部分重定位表结构包含系统装入程序在装入可执行 XCOFF 文件时需要正确重定位的所有重定位信息。 loader.h 文件定义重定位表字段。 装入程序部分重定位表中的每个条目在 XCOFF32中的长度为 12 个字节,在 XCOFF64中的长度为 16 个字节。 l_vaddrl_symndxl_rtype 字段与 reloc.h 文件中定义的常规重定位条目的相应字段具有相同的含义。 有关重定位条目的更多信息,请参阅 XCOFF 文件的重定位信息 (reloc.h)

表 7。 装入程序部分重定位表条目结构
字段名称和描述 XCOFF32 XCOFF64
l_vaddr+
地址字段
  • 偏移量: 0
  • 长度: 4
  • 偏移量: 0
  • 长度: 8
l_symndx+
所引用项的装入程序部分符号表索引
  • 偏移量: 4
  • 长度: 4
  • 偏移量: 12
  • 长度: 4
l_rtype
重定位类型
  • 偏移量: 4
  • 长度: 4
  • 偏移量: 8
  • 长度: 4
l_value+
地址字段
  • 偏移量: 8
  • 长度: 2
  • 偏移量: 8
  • 长度: 2
l_rsecnm
正在重定位的文件节号
  • 偏移量: 10
  • 长度: 2
  • 偏移量: 10
  • 长度: 2
注意:+定义 __X棺材混合 _ 时,请使用 "32" 或 "64" 后缀。

loader.h 文件定义以下字段:

姓名 描述
l_vaddr 指定可重定位引用的虚拟地址。
l_symndx 指定正在引用的符号的装入程序部分符号表索引 (n-th 条目)。 值 0 , 1 和 2 是隐式引用.text,.data.bss部分。 符号索引 3 是装入程序部分符号表中实际包含的第一个符号的索引。
注: 可以使用符号的节号 (符号编号 0 , 1 或 2) 或使用导出符号的实际编号来引用导出符号。
l_rtype 指定重定位大小和类型。 (此字段具有与r_typereloc.h 文件中的字段。) 有关重定位条目的更多信息,请参阅 XCOFF 文件的重定位信息 (reloc.h)
l_rsecnm 指定要重定位的部分的节号。 这是节标题中基于 1 的索引。

装入程序导入文件标识名称表定义

模块的装入程序部分导入文件标识名称字符串提供了系统装入程序为了成功装入模块而必须装入的从属模块的列表。 但是,此列表不包含指定模块所依赖的模块的名称。

表 8。 装入程序部分导入文件标识-包含变量长度字符串
偏移量 长度 (以字节计) 名称和描述
0 n 1 l_impedance路径

导入文件标识路径字符串,以 null 定界

n 1 + 1 n 2 l_impidbase

导入文件标识基本字符串,以 null 定界

n 1 + n 2 + 2 n 3 l_impidmem

导入文件标识成员字符串,以 null 定界

    字段对每个字符串重复。

每个导入文件标识名称都由三个以空定界的字符串组成。

第一个导入文件标识是系统装入程序要使用的缺省 LIBPATH 值。 LIBPATH 信息由以冒号分隔的文件路径组成。 没有基本名称或归档成员名,因此文件路径后跟三个空字节。

导入文件标识名称表中的每个条目都包含:

  • 导入文件标识路径名
  • 空定界符 (ASCII 空字符)
  • 导入文件标识基本名称
  • 空定界符
  • 导入文件标识 archive-file-member 名称
  • 空定界符

例如:

/usr/lib\0mylib.a\0shr.o\0

装入程序字符串表定义

装入程序部分字符串表包含参数类型检查字符串, XCOFF64 文件的所有符号名称以及 XCOFF32 文件的长度超过 8 字节的符号名称。 每个字符串都由后跟字符串的 2 字节长度字段组成。

表 9。 装入程序部分字符串表
偏移量 长度 (以字节计) 描述
0 2 字符串的长度。
2 n 符号名称字符串 (空定界) 或参数类型字符串 (非空定界)。
    字段对每个字符串重复。

符号名称以 null 结束。 length-field 中的值包括字符串的长度加上 null 终止符的长度,但不包括 length 字段本身的长度。

参数类型检查字符串包含二进制值,并且不是以 null 结束的。 长度字段中的值仅包括字符串的长度,但不包括长度字段本身的长度。

装入程序部分的符号表条目包含一个字节偏移值,该值指向字符串的第一个字节而不是长度字段。

装入程序部分标题内容

装入程序部分的部分标题字段的内容为:

姓名 内容
s_name .加载器
s_paddr 0
s_vaddr 0
s_size 装入程序部分的大小 (以字节计)
s_scnptr 从 XCOFF 文件开始到装入程序部分数据的第一个字节的偏移量
s_relptr 0
s_lnnoptr 0
s_nreloc 0
s_nlnno 0
s_flags STYP_加载器

有关 XCOFF 文件格式的常规信息,请参阅 "XCOFF 对象文件格式"

有关 XCOFF 文件部分的更多信息,请参阅 "Section and Section Headers ," "Debug Section ," "Type-Check Section ," "Exception Section ," and "Comment Section"

调试部分

调试部分包含符号调试器 stabstrings (符号表字符串)。 它由编译器和汇编程序生成。 它提供符号属性信息以供符号调试器使用。 调试部分在 XCOFF 部分头中具有部分类型标志 STYP_DEBUG 。 按照惯例.debug是调试节名称。 此部分中的数据是从 XCOFF 符号表中的条目引用的。 stabstring 是以 null 结束的字符串。 每个字符串前面都有 XCOFF32 中的 2 字节长度字段或 XCOFF64中的 4 字节长度字段。

字段定义

对于每个符号调试器 stabstring ,将重复以下两个字段:

  • 包含字符串长度的 2 字节 (XCOFF32) 或 4 字节 (XCOFF64) 长度字段。 长度字段中包含的值包括终止空字符的长度,但不包括长度字段本身的长度。
  • 符号调试器 stabstring。

请参阅 符号调试器 stabstring 语法的讨论,以了解 stabstring 的特定格式。

调试部分标题内容

调试节的节头字段的内容为:

姓名 内容
s_name .调试
s_paddr 0
s_vaddr 0
s_size 调试节的大小 (以字节计)
s_scnptr 从 XCOFF 文件开始到调试段数据的第一个字节的偏移
s_relptr 0
s_lnnoptr 0
s_nreloc 0
s_nlnno 0
s_flags STYP_调试

有关 XCOFF 文件格式的常规信息,请参阅 "XCOFF 对象文件格式"

有关 XCOFF 文件部分的更多信息,请参阅 "Section and Section Headers ," "Debug Section ," "Type-Check Section ,""Exception Section ," and "Comment Section"

DWARF 部分

DWARF 部分包含符号调试器的调试信息。 DWARF 是使用的替代调试格式,而不是调试器字符串。 可从 www.dwarfstd.org获取的 "DWARF 调试信息格式" 中描述了各种 DWARF 部分的内容。

所有 DWARF 节在 XCOFF 节头中都有主节类型标志 STYP_DWARF 。 传统节名称在 "常规头名称"中列出。

DWARF 节标题内容

调试节的节头字段的内容为:

姓名 内容
s_name 取决于 s_flags
s_paddr 0
s_vaddr 0
s_size 节的大小 (以字节计)。
s_scnptr 从 XCOFF 文件开始到节数据的第一个字节的偏移量。
s_relptr 从 XCOFF 文件开头到该部分的重定位条目的偏移量。
s_lnnoptr 0
s_nreloc 重定位条目数。
s_nlnno 0
s_flags 带有 DWARF 子类型值的 STYP_DWARF

类型-检查部分

类型检查部分包含类型检查散列字符串,并由编译器和汇编程序生成。 绑定程序用于在链接单独编译的对象文件时检测变量不匹配和自变量接口错误。 (装入程序部分中的类型检查散列字符串用于在运行程序之前检测这些错误。) type-check 节在 XCOFF 节标题中具有节类型标志 STYP_TYPCHK 。 按照惯例.typchk是 type-check 节名称。 此部分中的字符串是从 XCOFF 符号表中的条目引用的。

字段定义

对于每个参数类型检查字符串,将重复以下两个字段:

  • 包含类型检查字符串长度的 2 字节长度字段。 长度字段中包含的值不包括长度字段本身的长度。
  • 参数类型检查散列字符串。

数据的类型编码和检查格式

类型检查散列字符串用于在程序执行之前检测错误。 有关所有外部符号 (数据和函数) 的信息由编译器编码,然后在绑定时和装入时检查一致性。 类型检查字符串旨在实施所支持的每种特定语言的语义所需的最大检查,并为使用多种语言编写的应用程序提供保护。

类型编码和检查机制功能部件 4-部件散列编码,在检查时提供了一些灵活性。 该机制还使用与任何代码匹配的唯一值 UNIVERSAL。 UNIVERSAL 散列可以用作组装程序或类型信息或子例程接口可能未知的程序的转义机制。 UNIVERSAL 散列是四个空白 ASCII 字符 (0x20202020) 或四个空字符 (0x00000000)。

以下字段与类型编码和检查机制相关联:

描述
代码长度 包含散列长度的 2 字节字段。 此字段的值为 10。
语言标识 表示每种语言的 2 字节代码。 这些代码与为以下对象定义的代码相同:e_lang"异常部分" 信息中的字段。
常规散列 表示描述数据符号或函数的最常规格式的 4 字节字段。 此表单是 支持的语言最常见的表单。 如果信息不完整或不可用,应生成通用散列。 常规散列与语言无关,必须匹配才能使绑定成功。
语言散列 4 字节字段,包含常规散列中内容的更详细的特定于语言的表示。 它允许执行给定语言所需的最严格的类型检查。 此部分用于语言内绑定,除非两个符号具有相同的语言标识,否则不会进行检查。

部分标题内容

类型检查部分的部分标题字段的内容为:

姓名 内容
s_name .typchk
s_paddr 0
s_vaddr 0
s_size 类型检查部分的大小 (以字节计)
s_scnptr XCOFF 文件开始到类型检查部分数据的第一个字节的偏移量
s_relptr 0
s_lnnoptr 0
s_nreloc 0
s_nlnno 0
s_flags STYP_TYPCHK

有关 XCOFF 文件格式的常规信息,请参阅 "XCOFF 对象文件格式"

有关 XCOFF 文件部分的更多信息,请参阅 "Section and Section Headers ," "Debug Section ," "Type-Check Section ," "Exception Section ," and "Comment Section"

异常部分

异常部分包含陷阱指令,源语言标识代码和陷阱原因码的地址。 此部分由编译器和汇编程序生成,并在运行时期间或之后用于识别发生特定陷阱或异常的原因。 异常节在 XCOFF 节标题中具有节类型标志 STYP_EXCEPT 。 按照惯例.except是异常节名称。 从 XCOFF 符号表中的条目引用异常部分中的数据。

值为 0 的异常表条目e_reason字段包含函数的 C_EXT , C_WIDEXTC_HIDEXT 符号表条目的符号表索引。 通过函数辅助符号表项从符号表引用异常表中的条目。 有关此条目的更多信息,请参阅 "csect 辅助条目用于 C_EXT , C_WIDEXTC_HIDEXT 符号。"

可在 exceptab.h 文件中找到异常部分条目的 C 语言结构。

异常部分条目包含下表中显示的字段。

表 10. 初始条目: 异常部分结构
字段名称和描述 XCOFF32 XCOFF64
e_addr.e_symndx+
函数的符号表索引
  • 偏移量: 0
  • 长度: 4
  • 偏移量: 0
  • 长度: 4
e_lang+
编译器语言标识代码
  • 偏移量: 4
  • 长度: 1
  • 偏移量: 8
  • 长度: 1
e_reason+
值 0 (异常原因码 0)
  • 偏移量: 5
  • 长度: 1
  • 偏移量: 9
  • 长度: 1
注意:+定义 __X棺材混合 _ 时,请使用 "32" 或 "64" 后缀。 方式e_addr.e_symndx,后缀添加到e_addr(即e_addr32.e_symndx).
表 11. 后续条目: 异常部分结构
字段名称和描述 XCOFF32 XCOFF64
e_addr.e_paddr+
陷阱指令的地址
  • 偏移量: 0
  • 长度: 4
  • 偏移量: 0
  • 长度: 8
e_lang+
编译器语言标识代码
  • 偏移量: 4
  • 长度: 1
  • 偏移量: 8
  • 长度: 1
e_reason+
陷阱异常原因码
  • 偏移量: 5
  • 长度: 1
  • 偏移量: 9
  • 长度: 1
注意:+定义 __X棺材混合 _ 时,请使用 "32" 或 "64" 后缀。 方式e_addr.e_paddr,后缀添加到e_addr(即e_addr32.e_paddr).

字段定义

以下定义了异常部分中列出的字段:

描述
e_symndx 包含整数 (覆盖e_paddr字段)。 如果在请求中未找到e_reason字段为 0 ,此字段是函数的符号表索引。
e_paddr 包含虚拟地址 (覆盖e_symndx字段)。 如果在请求中未找到e_reason字段非零,此字段是陷阱指令的虚拟地址。
e_lang 指定源语言。 以下列表定义了e_lang
标识
语言
0x00
C
0x01
FORTRAN
0x02
Pascal
0x03
Ada
0x04
PL/I
0x05
BASIC
0x06
Lisp
0x07
COBOL
0x08
Modula2
0x09
C++
0x0A
RPG
0x0B
PL8和 PLIX
0x0C
装配
0x0D-0xFF
已预留
e_reason 指定与编译器相关的 8 位陷阱异常原因码。 零不是有效的陷阱异常原因码,因为它指示新函数的异常表条目的开始。

部分标题内容

以下字段是异常部分的部分标题字段的内容。

姓名 内容
s_name .除外
s_paddr 0
s_vaddr 0
s_size 异常部分的大小 (以字节计)
s_scnptr XCOFF 文件开始到异常部分数据的第一个字节的偏移量
s_relptr 0
s_lnnoptr 0
s_nreloc 0
s_nlnno 0
s_flags STYP_EXCEPT

有关 XCOFF 文件格式的常规信息,请参阅 "XCOFF 对象文件格式"

有关 XCOFF 文件部分的更多信息,请参阅 "Section and Section Headers ," "Debug Section ," "Type-Check Section ," "Exception Section ," and "Comment Section"

注释部分

注释部分包含对应用程序具有特殊处理意义的信息。 此部分可由编译器和组装者生成,并在运行时期间或之后用于满足应用程序的特殊处理需求。 注释节在 XCOFF 节标题中具有节类型标志 STYP_INFO 。 按照惯例.info是注释部分名称。 注释部分中的数据是从 XCOFF 符号表中的 C_INFO 条目引用的。

注释部分的内容由 4 字节的重复实例组成length字段后跟一串字节 (包含任何二进制值)。 每个字符串的长度存储在其前面的 4 字节中length。 字节字符串不需要由空字符或任何其他特殊字符终止。 指定的长度不包括length字段本身。 允许长度为 0。 未指定字节字符串的格式。

XCOFF 符号表中的条目引用注释部分字符串。 进行引用的符号的存储类为 C_INFO。 请参阅 "符号表字段内容 (按存储类)" 以获取更多信息。

C_INFO 符号与最接近的 C_FILEC_EXT , C_WIDEXT或其前面的 C_HIDEXT 符号相关联。

部分标题内容

以下字段是注释部分的部分标题字段的内容。

姓名 内容
s_name .info
s_paddr 0
s_vaddr 0
s_size 注释部分的大小 (以字节计)
s_scnptr XCOFF 文件开头到注释部分数据的第一个字节的偏移量
s_relptr 0
s_lnnoptr 0
s_nreloc 0
s_nlnno 0
s_flags STYP_INFO

有关 XCOFF 文件格式的常规信息,请参阅 "XCOFF 对象文件格式"

有关 XCOFF 文件部分的更多信息,请参阅 "Section and Section Headers ," "Debug Section ," "Type-Check Section ," "Exception Section ," and "Comment Section"

XCOFF 文件的重定位信息 (reloc.h)

某些部分具有重定位信息。 该s_relptr段标题中的字段指定该段的重定位项的文件偏移量。 当链接单个 XCOFF 对象文件以创建 XCOFF 可执行文件时,绑定程序使用重定位信息来修改地址常量和其他可重定位值。

编译器和汇编程序为部分的信息生成重定位条目。 绑定程序生成包含在.loader部分,根据系统装入程序的要求。

每个重定位条目的长度为 10 个字节 (对于 XCOFF64为 14 个字节)。 (迁入.loader部分长度为 12 个字节 (对于 XCOFF64为 16 个字节) ,在本文档的装入程序部分描述中进行了说明。 请参阅 "重新定位表字段定义" 以获取更多信息。) 您可以在 reloc.h 文件中找到重定位条目的 C 语言结构。 重定位条目包含下表中显示的字段。

表 12. 重定位条目结构
字段名称和描述 XCOFF32 XCOFF64
r_vaddr+
要重新定位的部分中的虚拟地址 (位置)
  • 偏移量: 0
  • 长度: 4
  • 偏移量: 0
  • 长度: 8
r_symndx+
引用的项的符号表索引
  • 偏移量: 4
  • 长度: 4
  • 偏移量: 8
  • 长度: 4
r_rsize+
搬迁大小和信息
  • 偏移量: 8
  • 长度: 1
  • 偏移量: 12
  • 长度: 1
r_rtype+
重定位类型
  • 偏移量: 9
  • 长度: 1
  • 偏移量: 13
  • 长度: 1
注意:+定义 __X棺材混合 _ 时,请使用 "32" 或 "64" 后缀。

区段的重定位条目必须采用升序地址顺序。

(装入程序部分包含系统装入程序使用的一组重定位条目; 因此每个重定位条目中都需要一个节号来标识需要修改的节。)

字段定义

以下定义了重定位信息字段:
描述
r_vaddr 指定需要绑定程序修改的值的虚拟地址。 需要从包含数据的部分开始修改的数据的字节偏移值可按如下所示计算:

offset_in_section = r_vaddr - s_paddr

r_symndx XCOFF 符号表中指定基于零的索引以查找引用的符号。 符号表条目包含用于计算要在以下位置应用的修改值的地址:r_vaddr重定位地址。
r_rsize 指定重定位大小和符号。 其内容详见以下列表:
0x80 (1 位)
指示重定位引用是已签名 (1) 还是未签名 (0)。
0x40 (1 位)
如果此字段为 1 ,那么表示绑定程序将原始指令替换为修改后的指令。
0x3F(6 位)
指定可重定位引用的位长度减 1。 当前体系结构允许重定位最多 32 位 (XCOFF32) 或 64 位 (XCOFF64) 的字段。
r_rtype 指定 8 位重定位类型字段,该字段向绑定程序指示要用于计算修改值的重定位算法。 此值将应用于由以下对象指定的可重定位引用位置:r_vaddr。 定义了以下重定位类型:
0x00
R_POS

指定正重定位。 提供由r_symndx

0x01
R_NEG

指定负重定位。 提供指定符号地址的负数r_symndx

0x02
资源 (R_REL)

指定相对自重定位。 提供由以下对象指定的符号的地址之间的位移值:r_symndx字段和要修改的 csect 的地址。

0x03
R_TOC

指定相对于 TOC 的重定位。 提供一个位移值,即 r_symndx 字段指定的符号中的地址值与 TOC 锚点 csect 的地址之间的差值。 TOC 锚点 csect 是一个符号,其存储映射类定义为 XMC_TC0 ,长度为 0。 每个 XCOFF 部分最多允许一个 TOC 锚 csect。

允许链接编辑器变换 r_vaddr 字段所引用的指令。 r_symndx字段指定的符号是 TOC 符号 (如果其存储映射类为 XMC_TC) ,而 TOC 符号包含 TOC 锚点或线程本地存储库的 32,768 比特内的另一个符号的地址。 因此,如果引用的指令是 load ,并且 r_symndx 字段指定的符号是 TOC 符号,那么可以将 load 转换为 add-immediate 指令。 此变换将在执行期间消除存储器引用。 如果转换了该指令,那么当写入输出文件时, R_TOC 重定位类型将替换为 R_TRLA 重定位类型。 如果对象已重新链接,那么这将启用反向变换。

0x12
R_TRL

指定相对于 TOC 的重定位。 此重定位条目与 R_TOC 重定位条目被视为相同,不同之处在于不允许链接编辑器将指令从装入转换为立即添加指令。

0x13
RR_TRLA

指定相对于 TOC 或相对于线程本地存储库的重定位。 r_vaddr 字段指定的指令是 add-immediate 指令,而 r_symndx 字段指定的符号必须是 TOC 符号,这意味着其存储映射类是 XMC_TC。 此指令先前由链接编辑器从装入指令转换为 add-immediate 指令。 链接编辑器将指令转换回装入指令,并将重定位类型从 R_TRLA 更改为 R_TOC。 可以再次变换该指令,如 R_TOC 重定位条目所述。

不允许编译器生成此重定位类型。

r_rtype持续
0x05
R_GL

指定全局链接-外部 TOC 地址重定位。 提供与定义的外部符号关联的 TOC 的地址。 具有所需 TOC 地址的外部符号由r_symndx重定位项的字段。 此重定位条目提供了一种方法来访问包含在同一可执行文件中的 TOC 地址。r_symndx定义了外部符号。

0x06
R_TCL

指定本地对象 TOC 地址重定位。 提供与定义的外部符号关联的 TOC 的地址。 需要 TOC 地址的外部符号由r_symndx重定位项的字段。 外部符号在生成的可执行文件中本地定义。 此重定位条目提供了一种方法来访问包含在同一可执行文件中的 TOC 地址。r_symndx定义了外部符号。

0x0C
R_RL

R_POS 重定位类型处理相同。

0x0D
R_RLA

R_POS 重定位类型处理相同。

0x0F
资源 (R_REF)

指定非重定位引用以防止垃圾回收 (通过绑定程序) 符号。 此重定位类型旨在为编译器和组装者提供一种方法,以指定给定的 csect 与另一个 csect 有依赖关系,而不使用实际 csect 中的任何空间。 生成依赖关系引用的原因是防止绑定程序对另一个 csect 具有隐式依赖关系的 csect 进行垃圾收集 (消除)。

0x08
R_BA

R_RBA 重定位类型处理相同。

0x18
RRBA

指定分支绝对重定位。 提供由r_symndx字段作为分支指令的目标地址。 如果目标地址可重定位,那么可以将该指令修改为 (相对) 分支指令。

0x0A
R. BR

R_RBR 重定位类型处理相同。

0x1A
R_RBR

指定 (相对) 分支重定位。 提供由以下对象指定的符号的地址之间的位移值:r_symndx字段和包含要修改的分支指令的 csect 的地址。 如果目标地址不可重定位,那么可以将该指令修改为绝对分支指令。

R_RBR 重定位类型是编译器和组装者用于 的标准分支重定位类型。 此重定位类型以及 glink 代码允许可执行对象文件具有独立于位置的文本部分。

r_rtype持续
0x20
R_TLS

使用常规动态模型指定线程本地存储器重定位。 为模块的线程本地存储器提供偏移量。

0x21
R_TLS_IE

R_TLS相同,只是使用了 initial-exec 模型。 即,引用的符号必须由主程序或在执行时装入的模块导出。

0x22
请求 TLS_LD

R_TLS相同,只是使用了本地动态模型。 即,引用的符号必须在引用模块中。

0x23
请求 TLS_LE

R_TLS相同,只是使用了 local-exec 模型。 即,引用和引用的符号都必须在主程序中。

0x24
R_TLSM

指定线程-本地存储器重定位。 提供所引用变量的线程本地存储器的句柄。 pthread 运行时使用句柄来定位线程本地存储器。

0x25
R_TLSML

指定线程-本地存储器重定位。 提供包含引用的模块的句柄。 该r_symndx字段必须指定包含引用的 csect 符号的符号表索引。

0x30
R_TOCU

指定 TOC 相对重定位的高位 16 位。 与 R_TOC 重定位类似,计算位移值。 位移值是 r_symndx 字段指定的符号中的地址值与 TOC 锚点 csect 的地址之间的差值。 位移的高阶 16 位用于更新指令。 如果 TOC 大小大于 231 字节,那么此重定位可能会溢出。

0x31
R_TOCL

指定 TOC 相对重定位的低阶 16 位。 与 R_TOC 重定位类似,计算位移值。 位移值是 r_symndx 字段指定的符号中的地址值与 TOC 锚点 csect 的地址之间的差值。 位移的低阶 16 位用于更新指令。

其他重定位功能

标准做法是仅保留未解析的引用或不同部分之间的引用的重定位信息。 解析引用后,将废弃重定位信息。 这足以用于增量绑定和固定地址空间模型。 为了提供重新绑定和处理可重定位地址空间模型的功能,不会从 XCOFF 文件中废弃重定位信息。

有关 XCOFF 文件格式的常规信息,请参阅 "XCOFF 对象文件格式"

有关重定位字段表定义的更多信息,请参阅装入程序部分中的 "重定位表字段定义"

XCOFF 文件的行号信息 (linenum.h)

行号条目由符号调试器用于在源级别调试代码。 存在时,可以具有符号调试器断点的每个源行都有一个行号条目。 行号按函数分组。 每个函数的开头都由l_lnno包含值 0 的字段。 第一个领域,l_symndx,是函数的 C_EXT , C_WIDEXTC_HIDEXT 符号表条目的符号表索引。

每个行号项的长度为 6 个字节。 可在 linenum.h 文件中找到行号条目的 C 语言结构。 行号条目包含下表中显示的字段。

表 13. 函数的初始行号结构条目
字段名称和描述 XCOFF32 XCOFF64
l_ addr.l_ symndx+
函数的符号表索引
  • 偏移量: 0
  • 长度: 4
  • 偏移量: 0
  • 长度: 4
l_ lnno +
值 0 (行号 0)
  • 偏移量: 4
  • 长度: 2
  • 偏移量: 8
  • 长度: 4
注意:+定义 __X棺材混合 _ 时,请使用 "32" 或 "64" 后缀。 方式l_addr.l_symndx,后缀添加到l_addr(即l_addr32.l_symndx).
表 14. 函数的后续行号条目
字段名称和描述 XCOFF32 XCOFF64
l_ paddr+
可插入断点的地址
  • 偏移量: 0
  • 长度: 4
  • 偏移量: 0
  • 长度: 8
l_ lnno +
相对于函数开始的行号
  • 偏移量: 4
  • 长度: 2
  • 偏移量: 8
  • 长度: 4
注意:+定义 __X棺材混合 _ 时,请使用 "32" 或 "64" 后缀。 方式l_addr.l_paddr,后缀添加到l_addr(即l_addr32.l_paddr).

字段定义

以下列表定义行号条目:

描述
l_symndx 指定函数名的符号表索引 (覆盖l_paddr字段)。 如果在请求中未找到l_lnno字段为 0 ,将使用此字段解释。
l_paddr 指定与行号关联的代码的第一个指令的虚拟地址 (覆盖l_symndx字段)。 如果在请求中未找到l_lnno字段不是 0 ,将使用此字段解释。
l_lnno 指定相对于函数开始的行号或 0 以指示函数开始。
注: 如果除开头以外的函数部分来自包含文件,那么行号是绝对的,而不是相对于函数的开头。 (请参阅 "按使用情况和符号值分类的存储类" 中的 C_BINCLC_EINCL 符号类型以获取更多信息。)

有关 XCOFF 文件格式的常规信息,请参阅 "XCOFF 对象文件格式"

有关调试的信息,请参阅 "调试部分"

符号表信息

XCOFF 文件定义了一个组合符号表。 符号表包含绑定程序 (外部符号) 和符号调试器 (函数定义以及内部和外部符号) 所需的信息。

符号表由 18 字节的固定长度条目列表组成。 符号表中表示的每个符号都至少包含一个固定长度的条目,有些条目后面跟有相同大小的辅助条目。

请参阅以下信息以了解有关符号表的更多信息:

对于每个外部符号,需要一个或多个辅助条目来提供有关外部符号的其他信息。 绑定程序感兴趣的外部符号有三种主要类型,可执行以下功能:

  • 定义可更换部件或 csects。
  • 定义 csects 中的函数或入口点的外部名称。
  • 在另一个 XCOFF 对象中引用外部函数的名称。

对于定义可替换单元 (csect) 的符号, csect 辅助条目定义 csect 的长度和存储映射类。 对于定义 csect 中函数的外部名称的符号, csect 辅助入口指向包含的 csect ,参数类型检查信息以及函数的符号调试器信息。 对于引用外部函数名称的符号, csect 辅助条目将符号标识为外部引用并指向参数类型检查信息。

符号表内容

XCOFF 符号表具有以下常规内容和排序:

  • C_FILE 符号表条目用于将与给定源文件关联的所有符号表条目括起来。
  • 属于源文件作用域的 C_INFO 注释节符号表条目。 它们跟在 C_FILE 条目之后,但在第一个 csect 定义符号表条目之前。
  • 属于文件作用域的符号调试器符号表条目。 这些内容跟在 C_FILE 条目之后,但在第一个 csect 条目之前。
  • DWARF 调试信息的 C_DWARF 符号。 这些符号跟在 C_FILE 条目之后,并且不应在 C_FILE 条目及其 C_DWARF 符号之间出现 csect 符号。
  • csect 定义符号表条目用于定义和括起 csect 中包含的所有符号。
  • C_INFO 注释节符号表条目 (跟在 csect 定义符号表条目后面) 与该 csect 相关联。
  • 跟在 csect 定义符号表项或标签符号表项后面的所有符号调试器符号表项都与该 csect 或标签相关联。

必须由编译器和汇编程序安排符号表的顺序,以适应符号调试器的要求,并允许绑定程序通过诸如垃圾回收,增量绑定和重新绑定之类的绑定操作对对象文件的不同部分进行有效管理。 绑定程序需要此排序,以便在删除或替换 csect 时,还可以删除或替换与 csect 关联的所有符号表信息。 同样,如果删除或替换与源文件关联的所有 csects ,那么还可以删除或替换与该文件关联的所有符号表和相关信息。

符号表布局

以下示例显示符号表的常规排序。

un_external      Undefined global symbols

.file                Prolog --defines stabstring compaction level
.file                Source file 1
  .info              Comment section reference symbol with file scope
  stab               Global Debug symbols of a file
  dwarf	             DWARF Information of a file
  csect              Replaceable unit definition (code)
     .info           Comment section reference symbol with csect scope
     function        Local/External function
         stab        Debug and local symbols of function
     function        Local/External function
         stab        Debug and local symbols of function
  ..............
  csect              Replaceable unit definition (local statics)
         stab        Debug and local statics of file
  ..............
  csect              Relocatable unit definition (global data)
         external    Defined global symbol
         stab        Debug info for global symbol
  ..............
.file                Source file 2
  stab               Global Debug symbols of a file
  dwarf	             DWARF Information of a file
  csect              Replaceable unit definition (code)
         function    Local/External function
             stab    Debug and local symbols of function
  ..............
  csect              Replaceable unit definition (local statics)
      stab           Debug and Local statics of file
  ..............
  csect              Replaceable unit definition (global data)
      external       Defined global symbol
          stab       Debug info for global symbol
.file                Source file
  ..............

符号表条目 (syms.h)

无论存储类和类型如何,每个符号都在符号表中具有固定格式的条目。 此外,某些符号类型可能具有紧跟在固定格式项之后的附加 (辅助) 符号表项。 符号表中的每个条目的长度为 18 个字节。 符号表条目的 C 语言结构可以在 syms.h 文件中找到。 符号表中第一个条目的索引为 0。 下表显示了符号表中每个符号的固定格式部分的结构。

表 15. 符号表项格式
字段名称和描述 XCOFF32 XCOFF64
n_name
符号名称 (占用与 n_zeroes n_offset相同的 8 字节)
  • 偏移量: 0
  • 长度: 8
  • 偏移量: 不适用
  • 长度: 不适用
n_zeroes
零,指示字符串表或 .debug 节中的名称 (覆盖 n_name的前 4 个字节)
  • 偏移量: 0
  • 长度: 4
  • 偏移量: 不适用
  • 长度: 不适用
n_offset+
字符串表或 .debug 部分中名称的偏移量 (在 XCOFF32: 覆盖 n_name的最后 4 个字节)
  • 偏移量: 4
  • 长度: 4
  • 偏移量: 8
  • 长度: 4
n_value+
符号值; 依赖于存储类
  • 偏移量: 8
  • 长度: 4
  • 偏移量: 0
  • 长度: 8
n_scnum
符号的节号
  • 偏移量: 12
  • 长度: 2
  • 偏移量: 12
  • 长度: 2
n_type
基本类型和派生类型规范
  • 偏移量: 14
  • 长度: 2
  • 偏移量: 14
  • 长度: 2
n_lang
源语言标识 (覆盖 n_type 的第一个字节)
  • 偏移量: 14
  • 长度: 1
  • 偏移量: 14
  • 长度: 1
n_cpu
CPU 类型标识 (覆盖 n_type的第二个字节)
  • 偏移量: 15
  • 长度: 1
  • 偏移量: 15
  • 长度: 1
n_sclass
符号的存储类
  • 偏移量: 16
  • 长度: 1
  • 偏移量: 16
  • 长度: 1
n_numaux
辅助条目数
  • 偏移量: 17
  • 长度: 1
  • 偏移量: 17
  • 长度: 1
注意:+定义 __X棺材混合 _ 时,请使用 "32" 或 "64" 后缀。

字段定义

以下定义符号表条目字段:

描述
n_name 仅由 XCOFF32 使用。 指定 8 字节的空填充符号名称或符号调试器 stabstring。 存储类字段用于确定该字段是符号名称还是符号调试器 stabstring。 按照约定,具有高位位的存储类值指示此字段是符号调试器 stabstring。

如果 XCOFF32 符号名称超过 8 字节,那么该字段将解释为以下两个字段:

n_zeroes
值 0 指示符号名称在字符串表中或.debug部分 (覆盖第一个词)n_name).
n_offset
指定字符串表中符号名称的字节偏移量或.debug部分 (覆盖 4 字节的最后一个字节)n_name)。 字节偏移量相对于字符串表的开始或.debug部分。 字节偏移值 0 是空或长度为零的符号名称。
n_offset 对于 XCOFF64: 指定字符串表中符号名称的字节偏移量,或者.debug部分。 字节偏移量相对于字符串表的开始或.debug部分。 字节偏移值 0 是空或长度为零的符号名称。 (仅适用于 XCOFF32 ,与n_zeroes. 请参阅上面的条目。)
n_value 指定符号值。 符号值字段的内容与存储类相关,如以下定义中所示:
内容
存储类
可重新定位的地址
C_EXT ,C_弱文本, C_HIDEXT , C_FCN , C_BLOCK , C_STAT
C_GSYM , C_BCOMM , C_DECL , C_ENTRY , C_ESTAT 和 C_ECOMM
Csect 中的偏移量
C_FUN 和 C_STSYM
文件中的偏移量
C_BINCL 和 C_EINCL
"注释" 部分中的偏移量
c_info
符号表索引
C_FILE 和 C_BSTAT
相对于堆栈帧的偏移量
C_LSYM 和 C_PSYM
注册号
C_RPSYM 和 C_RSYM
公共块内的偏移量
C_ECOML
相应 DWARF 部分中的偏移量
C_矮星
n_scnum 指定与下列其中一个符号关联的节号:
-2
指定特殊符号调试符号 N_DEBUG
-1
指定绝对符号 N_ABS。 符号具有值,但不可重定位。
0
指定未定义的外部符号 N_UNDEF
任何其他值
指定在其中定义符号的节号。
n_type 此字段的使用取决于符号的存储类。 对于 C_FILE 符号,请参阅 " C_FILE 符号的文件辅助条目"

对于 C_EXTC_HIDEXTC_WIDEXT 符号,n_type字段在 XCOFF32中有两种解释,在 XCOFF64中有一种解释。 旧解释在 XCOFF32 中使用 (如果o_vstamp辅助头中的字段为 1。

在旧的 XCOFF32 解释中,如果符号是函数,那么可以设置位 10 (0x0020)。 否则,位 10 应该为 0。 其余位在 COFF 文件中定义以表示类型信息,并且不再使用。

XCOFF64 和新的 XCOFF32 解释中, n_type字段用于符号类型和可视性,如下所示:

位 0-3
符号可视性。 值为 0xF000SYM_V_MASK 宏可用于屏蔽n_type未指定可视性的字段。 定义了以下可视性:
0x1000	SYM_V_INTERNAL
0x2000	SYM_V_HIDDEN
0x3000	SYM_V_PROTECTED
0x4000	SYM_V_EXPORTED
位 10
(可选) 如果符号是函数,请设置为 1。 否则,将其设置为 0。
位 4-9,11-15
保留以供将来使用。

ld 命令中描述了符号可视性。

注: 对于所有其他存储类,n_type字段保留以供将来使用,并且应该包含 0。
n_sclass 指定符号的存储类。 storclass.hdbxstclass.h 文件包含存储类的定义。 请参阅 "符号表字段内容 (按存储类)" 以获取更多信息。
n_numaux 指定符号的辅助条目数。 在 XCOFF64中,辅助符号具有标识类型字段,但在 XCOFF32中,没有类型字段。 因此,如果一个符号需要多个辅助条目,那么辅助条目的顺序由约定确定。

有关 XCOFF 文件格式的常规信息,请参阅 "XCOFF 对象文件格式"

符号表辅助信息

符号表包含用于提供符号补充信息的辅助条目。 符号的辅助项跟在其符号表项之后。 每个辅助项的长度与符号表项 (18 字节) 相同。 辅助条目的格式和数量取决于存储类 (n_sclass) 和类型 (n_type) 符号表项。

在 XCOFF32中,存储类为 C_EXT , C_WIDEXTC_HIDEXT 的符号以及多个辅助条目必须将 csect 辅助条目作为最后一个辅助条目。 在 XCOFF64中,x_auxtype每个辅助符号表项的字段区分符号,但约定是最后生成 csect 辅助符号表项。

C_FILE 符号的文件辅助条目

文件辅助符号表条目定义为包含源文件名和与编译器相关的字符串。 文件辅助条目是可选的,用于存储类值为 C_FILE的符号表条目。 可以在 syms.h 文件中的 x_file 结构中找到文件辅助条目的 C 语言结构。

C_FILE 符号提供了源文件名称信息,源语言标识和 CPU 版本标识信息以及 (可选) 编译器版本和时间戳记信息。

n_type符号表项的字段标识源文件的源语言和已编译对象文件的 CPU 版本标识。 现场信息如下:

描述
Source Language ID 覆盖高位字节n_type。 此字段包含源语言标识。 此字段的值在e_lang"Exception Section" 中的字段。 符号调试器可以使用此字段来确定源语言。

对于没有 C_FILE 符号表条目的对象文件中的符号,此字段的可选值为 248 (TB_OBJECT); 对于用于提供调试信息的已生成条目,可选值为 249 (TB_FRONT) 或 250 (TB_BACK)。 如果源语言为 TB_FRONT 或 TB_BACK ,那么 8 字符名称字段以' '(空白) , "\0" (NULLl)。 如果源语言是 TB_FRONT ,那么第三个字节是对象文件的 stabstring 压缩级别,而 n_offset 字段包含 TB_BACK 符号表条目的符号表索引 (如果存在) 或 0。

CPU Version ID 定义为低阶字节n_type。 对为文件生成的指令类型进行解密。 定义了以下值:
0
已保留。
1
指定 , 32 位方式。
2
已保留。
3
指定 32 位和 处理器的公共交集。
4
指定 处理器。
5
指定不同体系结构之间的任何指令组合。
6
指定 指令的混合 ()。
7-223
已保留。
224
指定 指令。
225-255
已保留。

如果两个字段都是 0 ,那么不会提供有关源语言的信息。

文件名辅助条目格式
偏移量
长度 (以字节计)
姓名
描述
0
14
x_fname
源文件字符串
0
4
x_zeroes
零,指示字符串表中的文件字符串 (覆盖前 4 个字节)x_fname)
4
4
x_offset
字符串表中文件字符串的偏移量 (覆盖 5th-8th 个字节)x_fname)
14
1
x_ftype
文件字符串类型
15 日
2
已保留。 必须包含 0。
17
1
x_auxtype
辅助符号类型 (仅限XCOFF64 )

字段定义

下面定义了上面列出的字段:

描述
x_fname 指定源文件名或与编译器相关的字符串。

如果文件名或字符串的长度超过 8 字节,那么该字段将解释为以下两个字段:

x_zeroes
值 0 指示源文件字符串位于字符串表中 (覆盖第一个 4 字节的x_fname).
x_offset
指定从字符串表的开头到源文件字符串的第一个字节的偏移量 (覆盖 4 字节的最后一个字节)x_fname).
x_ftype 指定源文件字符串类型。
0 XFT_FN
指定源文件名
1 XFT_CT
指定编译器时间戳记
2 XFT_CV
指定编译器版本号
128 个 XFT_CD
指定编译器定义的信息
(无名称) 已保留。 此字段必须包含 0 的 2 字节。
x_auxtype (仅限XCOFF64 ) 指定辅助条目的类型。 包含此辅助条目的 _AUX_FILE。

如果未使用文件辅助条目,那么符号名称是源文件的名称。 如果使用了文件辅助项,那么符号名称应该是.file,并且第一个文件辅助条目 (按约定) 包含源文件名。 给定符号表项允许多个文件辅助项。 该n_numaux字段包含文件辅助条目数。

C_EXT , C_WIDEXT 和 C_HIDEXT 符号的 csect 辅助条目

csect 辅助条目标识 csects (节定义) ,入口点 (标签定义) 和外部引用 (标签声明)。 对于存储类值为 C_EXT , C_WIDEXTC_HIDEXT的每个符号表条目,都需要 csect 辅助条目。 请参阅 "符号表条目 (syms.h)" 以获取更多信息。 按照约定, XCOFF32 文件中的 csect 辅助条目必须是具有多个辅助条目的任何外部符号的最后一个辅助条目。 可以在 syms.h 文件的 x_csect 结构中找到 csect 辅助条目的 C 语言结构。

表 16. csect 辅助项格式
字段名称和描述 XCOFF32 XCOFF64
x_scnlen
(请参阅字段定义部分)
  • 偏移量: 0
  • 长度: 4
  • 偏移量: 不适用
  • 长度: 不适用
x_scnlen_lo
(请参阅字段定义部分) 段长度的低 4 字节
  • 偏移量: 不适用
  • 长度: 不适用
  • 偏移量: 0
  • 长度: 4
x_parmhash
.typchk 部分中参数类型的偏移量-检查散列
  • 偏移量: 4
  • 长度: 4
  • 偏移量: 4
  • 长度: 4
x_snhash
.typchk 节号
  • 偏移量: 8
  • 长度: 2
  • 偏移量: 8
  • 长度: 2
x_smtyp
符号对齐和类型 3-bit 符号对齐 (log 2) 3-bit 符号类型
  • 偏移量: 10
  • 长度: 1
  • 偏移量: 10
  • 长度: 1
x_smclas
存储器映射类
  • 偏移量: 11
  • 长度: 1
  • 偏移量: 11
  • 长度: 1
x_stab
已预留
  • 偏移量: 12
  • 长度: 4
  • 偏移量: 不适用
  • 长度: 不适用
x_snstab
已预留
  • 偏移量: 16
  • 长度: 2
  • 偏移量: 不适用
  • 长度: 不适用
x_scnlen_hi
(请参阅字段定义部分) 部分长度的高 4 字节
  • 偏移量: 不适用
  • 长度: 不适用
  • 偏移量: 12
  • 长度: 4
(垫)
已预留
  • 偏移量: 不适用
  • 长度: 不适用
  • 偏移量: 16
  • 长度: 1
x_auxtype
包含 _AUX_CSECT; 指示辅助条目的类型
  • 偏移量: 不适用
  • 长度: 不适用
  • 偏移量: 17
  • 长度: 1

字段定义

下面定义了上面列出的字段:
描述
x_scnlen 指定依赖于的含义x_smtyp如下所示:
如果
过去
XTY_SD
x_scnlen包含 csect 长度。
XTY_LD
x_scnlen包含包含 csect 的符号表索引。
XTY_CM
x_scnlen包含 csect 长度。
XTY_ER
x_scnlen包含 0。
在 XCOFF64 格式中,x_scnlen分为两个字段:x_scnlen_hi,表示值的 4 字节上限,以及x_scnlen_lo,表示值的较低 4 字节。
x_parmhash 指定参数 type-check 字符串在.typchk部分。 字节偏移量从.typchkXCOFF 文件中的部分。 字节偏移量指向参数类型检查字符串的第一个字节 (而不是其长度字段)。 请参阅 "类型-检查部分" 以获取更多信息。 0 的值x_parmhash字段指示此符号不存在参数类型检查字符串,并且该符号将被视为具有通用散列。 对于 C_HIDEXT 符号,该值应为 0。
x_snhash 指定.typchk段号。 包含参数类型检查字符串的 XCOFF 节号。 节号是基于 1 的。 为了与某些编译器生成的对象文件兼容,如果x_parmhash不等于 0 ,但x_snhash执行等于 0 ,然后第一个.typchk将使用该文件中的部分。 对于 C_HIDEXT 符号,该值应为 0。
x_smtyp 指定符号对齐方式和类型:
位 0-4
包含 5 位 csect 地址对齐值 (日志库 2)。 例如,此字段中的值 3 指示 23 或 8 ,这表示 csect 将在 8 字节的地址值上对齐。 仅当位的值为 5-7 时,才会使用对齐值。x_smtyp字段为 XTY_SDXTY_CM
位 5-7
包含 3 位符号类型字段。 请参阅位 5-7 的定义l_smtype"装入程序部分" 中的字段以获取更多信息。
x_smclas 指定 csect 存储映射类。 此字段允许绑定程序按其存储映射类排列 csects。 该x_smclas仅当位 5-7 的值为以下值时,才会使用此字段:x_smtyp字段为 XTY_SDXTY_CM

以下存储映射类是只读的,通常映射到.text部分:

值类
描述
0 XMC_PR
指定程序代码。 csect 包含程序的可执行指令。
1 XMC_RO
指定只读常量。 csect 包含常量数据,并且在程序执行期间不会更改这些数据。
2 XMC_DB
指定调试字典表。 csect 包含符号调试数据或异常处理数据。 定义此存储映射类是为了允许具有特殊符号调试或异常处理需求的编译器将数据放入在执行时装入但可与程序的可执行代码分开收集的 csects 中。
6 XMC_GL
指定全局链接。 csect 提供了处理对可能超出模块的目标符号的 csect 相对调用所必需的接口代码。 此全局链接 csect 具有与目标符号相同的名称,并成为相对调用的本地目标。 因此, csect 在.text可执行 XCOFF 对象文件的部分。
7 XMC_XO
指定扩展操作。 此类型的 csect 不依赖于 (通过) TOC。 它打算驻留在内存中的固定地址,以便它可以成为分支绝对指令的目标。
12 个 XMC_TI
已保留。
13 个 XMC_TB
已保留。

以下存储映射类是读/写类,通常映射到.data.bss部分:

值类
描述
5 XMC_RW
指定读/写数据。 此类型的 csect 包含在程序执行期间允许修改的已初始化或未初始化的数据。 如果x_smtyp值为 XTY_SD, csect 包含已初始化的数据并映射到.data部分。 如果x_smtyp值为 XTY_CM, csect 未初始化并映射到.bss部分。 通常,来自 C 源文件的所有已初始化静态数据都包含在此类型的单个 csect 中。 csect 的存储类值为 C_HIDEXT。 来自 C 源文件的全局数据标量或结构的已初始化定义包含在其自己的此类型的 csect 中。 csect 的存储类值为 C_EXT。 此类型的 csect 可通过其他对象文件中的名称引用进行访问。
x_smclas持续
值类
描述
15 XMC_TC0
指定 TOC 可寻址性的 TOC 锚点。 这是一个长度为零的 csect ,其n_value地址提供 TOC 相对可寻址性的基本地址。 对于 XCOFF 对象文件的每个部分,仅允许一个类型为 XMC_TC0 的 csect。 在允许编译器和汇编程序生成多个.data节,在每个节中必须有一个类型为 XMC_TC0 的 csect ,其中包含作为 TOC 相对数据项引用的数据 (通过重定位条目)。 某些硬件体系结构限制负载指令中的相对位移字段可能包含的值。 然后,此限制将成为可执行 XCOFF 对象的 TOC 大小的固有限制。 对于RS/6000,该限制为 65,536 字节,即 16,384 个 4 字节 TOC 条目。
3 XMC_TC
22 个 XMC_TE
指定常规 TOC 条目。 此类型的 Csects 与指针大小相同,并且包含其他 csects 或全局符号的地址。 这些 csects 提供其他 csects 或符号的可寻址性。 这些符号可能在本地可执行 XCOFF 对象或另一个可执行 XCOFF 对象中。 绑定程序使用特殊处理语义来消除重复的 TOC 条目,如下所示:
  • 存储类值为 C_EXT 的符号是全局符号,必须具有名称 (非空)n_name字段)。 这些符号不需要特殊的 TOC 处理逻辑来组合重复的条目。 具有相同内容的重复条目n_name值组合成单个条目。
  • 存储类值为 C_HIDEXT 的符号不是全局符号,重复条目由上下文解析。 只要满足以下条件,任何两个此类符号都将定义为重复符号并组合到单个条目中:
    • n_name字段相同。 即,它们具有空名称或相同的名称字符串。
    • 每个都是与指针相同的大小。
    • 每个都有一个引用具有相同名称的外部符号的 RLD 条目。

为了最大限度减少绑定程序无法组合的重复 TOC 条目数,编译器和汇编程序应遵循 TOC 条目的公共命名约定。 按照约定,编译器和汇编程序会生成存储类值为 C_HIDEXT 的 TOC 条目以及n_name与该字符串相同的字符串n_nameTOC 条目所寻址的符号的值。

存储映射类 XMC_TCXMC_TE 等效,但绑定程序应在 XMC_TCXMC_TD 符号之后映射 XMC_TE 符号。

x_smclas持续
值类
描述
16 个 XMC_TD
指定 TOC 中的标量数据条目。 一种特殊形式的 XMC_RW csect ,由编译器生成的代码直接从 TOC 访问。 这使得一些常用的 globol 符号可以直接从 TOC 访问,而不是通过 TOC 中包含的地址指针 csect 间接访问。 类型为 XMC_TD 的 csect 具有以下特征:
  • 编译器生成相对于直接访问类型为 XMC_TD的 csect 中包含的数据的 TOC 代码。
  • 长度为 4-字节或更少。
  • 它已初始化可以在程序运行时修改的数据。
  • 如果存在类型为 XMC_RWXMC_UA 的同一指定 csect ,那么会将其替换为 XMC_TD csect。

对于 TOC 标量不能驻留在 TOC 中的情况,绑定程序必须能够将编译器生成的 TOC 相对指令转换为传统的间接寻址指令序列。 如果 TOC 标量包含在共享对象中,那么此变换是必需的。

10 个 XMC_DS
指定包含函数描述符的 csect ,该函数描述符包含以下三个值:
  • 函数的可执行代码的地址。
  • 包含该函数的模块的 TOC 锚点 (TOC 基本地址) 的地址。
  • 环境指针(用于Pascal等语言 PL/I )。

一个函数只有一个函数描述符 csect ,它必须包含在包含函数本身的同一可执行文件中。 函数描述符具有存储类值 C_EXT ,并且具有n_name与源文件中的函数名称相同的值。 函数描述符的地址将导入到可执行 XCOFF 文件并从该文件导出。

8 XMC_SV
指定 32 位管理程序调用描述符 csect。 管理程序调用描述符包含在操作系统内核中。 对于应用程序,将对管理程序调用描述符的引用视为与对常规函数描述符的引用相同。 通过导入/导出机制,函数描述符被视为管理程序调用描述符。 这些符号仅可用于 32 位程序。
17 XMC_SV64
指定 64 位管理程序调用描述符 csect。 请参阅 XMV_SV 以获取主管呼叫信息。 这些符号仅可用于 64 位程序。
18 XMC_SV3264
指定 32 位和 64 位的管理程序调用描述符 csect。 请参阅 XMV_SV 以获取主管呼叫信息。 这些符号可用于 32 位和 64 位程序。
4 XMC_UA
未分类。 此 csect 被视为读/写。 此 csect 通常由无法确定所生成 csect 的真实分类的汇编程序或对象文件转换程序生成。
9 XMC_BS
指定 BSS 类 (未初始化的内部静态)。 此类型的 csect 未初始化,打算映射到.bss部分。 此类型的 csect 必须具有x_smtypXTY_CM的值。
x_smclas持续
值类
描述
11 个 XMC_UC
指定未命名的公共 FORTRAN。 此类型的 csect 用于未命名且未初始化的 FORTRAN 公共。 打算映射到.bss部分。 此类型的 csect 必须具有x_smtypXTY_CM的值。

以下存储映射类是读写的,并且映射到.tdata部分:

20 个 XMC_TL
指定读/写线程本地数据。 此类型的 csect 包含进程中每个线程的本地初始化数据。 创建新线程时,将使用类型为 XMC_TL 的 csect 来初始化线程的线程本地数据。

以下存储映射类是读写的,并且映射到.tbss部分:

21 个 XMC_UL
指定读/写线程本地数据。 此类型的 csect 包含进程中每个线程的本地未初始化数据。 创建新线程时,此类型的 csect 的线程本地存储器将初始化为零。
x_stab 保留 (未用于 64 位)。
x_snstab 保留 (未用于 64 位)。

C_EXT , C_WIDEXT 和 C_HIDEXT 符号的辅助条目

辅助符号表条目在 XCOFF 中定义,以包含与定义的函数相关联的引用和大小信息。 这些辅助条目由编译器和汇编程序生成,供符号调试器使用。 在 XCOFF32中,函数辅助符号表条目包含必需的信息。 在 XCOFF64中,可能需要一个函数辅助条目和一个执行辅助条目。 当为单个 C_EXT , C_WIDEXTC_HIDEXT 符号生成两个辅助条目时,x_sizex_endndx字段必须具有相同的值。

下表中定义了函数辅助符号表项。

表 17. 功能辅助项格式
字段名称和描述 XCOFF32 XCOFF64
x_exptr
异常表条目的文件偏移量
  • 偏移量: 0
  • 长度: 4
  • 偏移量: 不适用
  • 长度: 不适用
x_fsize
函数大小 (以字节计)
  • 偏移量: 4
  • 长度: 4
  • 偏移量: 8
  • 长度: 4
x_lnnoptr
指向行号的文件指针
  • 偏移量: 8
  • 长度: 4
  • 偏移量: 0
  • 长度: 8
x_endndx
此函数之外的下一个条目的符号表索引
  • 偏移量: 12
  • 长度: 4
  • 偏移量: 12
  • 长度: 4
(垫)
未使用
  • 偏移量: 16
  • 长度: 2
  • 偏移量: 16
  • 长度: 1
x_auxtype
包含 _AUX_FCN; 辅助条目的类型
  • 偏移量: 不适用
  • 长度: 不适用
  • 偏移量: 17
  • 长度: 1

字段定义

下面定义了 "功能辅助项格式" 表中列出的字段:

描述
x_exptr (仅限XCOFF32 ) 此字段是指向异常表条目的文件指针。 该值是从 XCOFF 对象文件开始的字节偏移量。 在 XCOFF64 文件中,异常表偏移量位于异常辅助符号表条目中。
x_fsize 指定函数的大小 (以字节计)。
x_lnnoptr 指定指向行号的文件指针。 该值是从 XCOFF 对象文件开始的字节偏移量。
x_endndx 指定此函数之外的下一个条目的符号表索引。

下表中显示了仅在 XCOFF64 中定义的异常辅助符号表条目。

表 18. 异常辅助条目格式 (仅限XCOFF64 )
偏移量 长度 名称和描述
0 8
x_exptr
异常表项的文件偏移量。
8 4
x_fsize
函数大小 (以字节计)
12 4
x_endndx
此函数之外的下一个条目的符号表索引
16 1
(垫)
未使用
17 1
x_auxtype
包含 _AUX_EXCEPT; 辅助条目的类型

字段定义

以下定义 "异常辅助条目格式" 表中列出的字段:

描述
x_exptr 此字段是指向异常表条目的文件指针。 该值是从 XCOFF 对象文件开始的字节偏移量。
x_fsize 指定函数的大小 (以字节计)。
x_endndx 指定此函数之外的下一个条目的符号表索引。

C_BLOCK 和 C_FCN 符号的块辅助条目

在 XCOFF 中定义符号辅助符号表项以提供与函数的开始和结束块相关联的信息。 符号辅助符号表项由编译器生成,供符号调试器使用。

表 19. 表条目格式
字段名称和描述 XCOFF32 XCOFF64
(无名称)
已预留
  • 偏移量: 0
  • 长度: 2
  • 偏移量: 不适用
  • 长度: 不适用
x_lnnohi
源行号的高位 2 字节
  • 偏移量: 2
  • 长度: 2
  • 偏移量: 不适用
  • 长度: 不适用
x_lnno
源行号的低阶 2 字节
  • 偏移量: 4
  • 长度: 2
  • 偏移量: 不适用
  • 长度: 不适用
x_lnno
源行号
  • 偏移量: 不适用
  • 长度: 不适用
  • 偏移量: 0
  • 长度: 4
(无名称)
已预留
  • 偏移量: 6
  • 长度: 12
  • 偏移量: 4
  • 长度: 13
x_auxtype
包含 _AUX_SYM; 辅助条目的类型
  • 偏移量: 不适用
  • 长度: 不适用
  • 偏移量: 17
  • 长度: 1

字段定义

下面定义了上面的字段:

描述
(无名称) 已保留。
x_lnnohi 对于 XCOFF32,指定源文件行号的高阶 16 位。
x_lnno 指定源文件的行号。 此字段的最大值为 65535 (对于 XCOFF64 ) 和 232 (对于 XCOFF64)。

C_STAT 符号的部分辅助条目

在 XCOFF32 中定义了节辅助符号表条目标识,以在符号表中提供有关编译器或汇编程序生成的节大小的信息。 编译器生成此信息是可选的,绑定程序将忽略并除去此信息。

注: x_scnlenx_nreloc 之后的 + 应该是上标。 您可以在现有文档中找到此上标的其他实例。
表 20. 部分辅助条目格式 (仅XCOFF32 )
偏移量 长度 (以字节计) 名称和描述
0 4
x_scnlen
部分长度
4 2
x_nreloc
重定位条目数
6 2
x_nlinno
行号数
8 10
(无名称)
已预留

字段定义

以下列表定义了字段:

描述
x_scnlen 指定节长度 (以字节计)。
x_nreloc 指定重定位项的数目。 此字段的最大值为 65535。
x_nlinno 指定行号数。 此字段的最大值为 65535。
(无名称) 已保留。

有关 XCOFF 文件格式的常规信息,请参阅 "XCOFF 对象文件格式" 。 有关符号表的更多信息,请参阅 "符号表信息"

有关调试的信息,请参阅 "调试部分"

C_DWARF 符号的 SECT 辅助条目

SECT 辅助符号表条目定义为在符号表中提供有关由 C_DWARF 符号表示的部分的大小的信息。

表 21. C_DWARF 符号的部分辅助条目格式
字段名称和描述 XCOFF32 XCOFF64
x _场景长度+
由符号表示的部分的长度。
  • 偏移量: 0
  • 长度: 4
  • 偏移量: 0
  • 长度: 8
(无名称)
已预留
  • 偏移量: 4
  • 长度: 4
  • 偏移量: 不适用
  • 长度: 不适用
x_nreloc +
部分中的重定位条目数
  • 偏移量: 8
  • 长度: 4
  • 偏移量: 8
  • 长度: 8
(无名称)
已预留
  • 偏移量: 12
  • 长度: 4
  • 偏移量: 不适用
  • 长度: 不适用
(无名称)
已预留
  • 偏移量: 16
  • 长度: 2
  • 偏移量: 16
  • 长度: 1
x_auxtype
包含 _AUX_SECT; 辅助条目的类型
  • 偏移量: 不适用
  • 长度: 不适用
  • 偏移量: 17
  • 长度: 1
注意:+定义 __X棺材混合 _ 时,请使用 "32" 或 "64" 后缀。

字段定义

以下列表定义了字段:

描述
(no name) 已预留
x_scnlen 此符号表示的部分部分的大小。
x_nreloc 此符号的重定位项数。 绑定程序将此字段设置为 0。

符号表字段内容 (按存储类)

此部分定义每个已定义的存储类的符号表字段内容 (n_sclass) 在 XCOFF 中使用。 下表按字母顺序列出了存储类条目。 请参阅 "符号表条目 (syms.h)" 以获取更多信息。

表 22. 符号表 (按存储类)
类定义 字段内容
C_BCOMM 135 公共块的开头
名称
公共块的名称 *
n_value
0 ,未定义
n_scnum
N_DEBUG
欧 条目
C_BINCL 108 包含文件的开头
名称
包含文件的源名称 **
n_value
文件指针 (file pointer)
n_scnum
N_DEBUG
欧 条目
C_BLOCK 100 内部块的开始或结束
名称
.bb 或者 .eb
n_value
可重新定位的地址
n_scnum
N_SCNUM
欧 条目
BLOCK
C_BSTAT 143 静态块开始
名称
.bs
n_value
符号表索引
n_scnum
N_DEBUG
欧 条目
C_DECL 140 对象 (类型) 声明
名称
调试器 stabstring *
n_value
0 ,未定义
n_scnum
N_SCNUM
欧 条目
C_DWARF 112 DWARF 符号
名称
与相应 DWARF 部分的名称相同
n_value
可重定位的偏移量到相应的 DWARF 部分中
n_scnum
DWARF 节的节号
欧 条目
SECT
C_ECOML 136 公共块的本地成员
名称
调试器 stabstring *
n_value
公共块内的偏移量
n_scnum
N_ABS
欧 条目
C_ECOMM 137 公共块结束
名称
调试器 stabstring *
n_value
0 ,未定义
n_scnum
N_DEBUG
欧 条目
C_EINCL 109 包含文件结束
名称
包含文件的源名称 **
n_value
文件指针 (file pointer)
n_scnum
N_DEBUG
欧 条目
C_ENTRY 141 备用条目
名称
*
n_value
0 ,未定义
n_scnum
N_DEBUG
欧 条目
C_ESTAT 144 静态块结束
名称
.es
n_value
0 ,未定义
n_scnum
N_DEBUG
欧 条目
C_EXT 2 外部符号 (定义用于绑定程序处理的外部符号)
名称
符号名称 **
n_value
可重新定位的地址
n_scnum
N_SCNUMN_UNDEF
欧 条目
函数 CSECT
C_FCN 101 函数开始或结束
名称
.bf 或者 .ef
n_value
可重新定位的地址
n_scnum
N_SCNUM
欧 条目
BLOCK
C_FILE 103 源文件名称和编译器信息
名称
.file 或源文件名 (如果没有辅助条目) * *
n_value
符号表索引
n_scnum
N_DEBUG
欧 条目
文件
C_FUN 142 函数或过程
名称
调试器 stabstring *
n_value
包含 csect 内的偏移量
n_scnum
N_ABS
欧 条目
C_GSYM 128 全局变量
名称
调试器 stabstring *
n_value
0 ,未定义
n_scnum
N_DEBUG
欧 条目
C_GTLS 145 全局线程局部变量
名称
调试器 stabstring *
n_value
0 ,未定义
n_scnum
N_DEBUG
欧 条目
C_HIDEXT 107 未命名的外部符号
名称
符号名称或空 * *
n_value
可重新定位的地址
n_scnum
N_SCNUM
欧 条目
函数 CSECT
C_INFO 100 注释部分参考
名称
信息名称标识或空 * *
n_value
注释部分中的偏移量
n_scnum
N_SCNUM
欧 条目
C_LSYM 129 在堆栈上分配的自动变量
名称
调试器 stabstring *
n_value
相对于堆栈帧的偏移量
n_scnum
N_ABS
欧 条目
C_NULL 0 标记为待删除的符号表条目。
名称
n_value
0x00DE1E00
n_scnum
欧 条目
任何
c_PSYM 130 对堆栈上分配的子例程的自变量
名称
调试器 stabstring *
n_value
相对于堆栈帧的偏移量
n_scnum
N_ABS
欧 条目
c_RPSYM 132 存储在寄存器中的函数或过程的自变量
名称
调试器 stabstring *
n_value
注册号
n_scnum
N_ABS
欧 条目
C_RSYM 131 寄存器变量
名称
调试器 stabstring *
n_value
注册号
n_scnum
N_ABS
欧 条目
C_STAT 3 静态符号 (未知。 某些编译器在符号表中生成这些符号以标识.text,.data.bss部分。 未由绑定程序使用或保留。)
名称
符号名称 **
n_value
可重新定位的地址
n_scnum
N_SCNUM
欧 条目
SECTION
C_STSYM 133 静态分配符号
名称
调试器 stabstring *
n_value
Csect 中的偏移量
n_scnum
N_DEBUG
欧 条目
C_STTLS 146 静态线程局部变量
名称
调试器 stabstring *
n_value
0 ,未定义
n_scnum
N_DEBUG
欧 条目
C_TCSYM 134 保留
名称
调试器 stabstring *
n_value
n_scnum
欧 条目
C_WEEXT 111 弱外部符号 (定义用于绑定程序处理的弱外部符号)
名称
符号名称 **
n_value
可重新定位的地址
n_scnum
N_SCNUM N_UNDEF
欧 条目
函数 CSECT
注意:
  1. * 对于长名称,n_offset值是到.debug部分。
  2. ** 对于长名称,n_offset值是字符串表中的偏移量。

存储类 (按使用情况和符号值分类)

以下是绑定程序使用和重定位的存储类。 符号值 (n_value) 是地址。

描述
C_EXT 指定外部或全局符号
C_弱文本 指定具有弱绑定的外部或全局符号
C_HIDEXT 指定内部符号
C_BLOCK 指定内部块的开始或结束 (.bb.eb)
C_FCN 指定函数的开头或结尾 (.bf.ef(只读)
C_STAT 指定静态符号 (包含在 statics csect 中)

以下是绑定程序和符号调试器或其他实用程序用于文件作用域限定和访问目的的存储类:

描述
文件 指定源文件名。 该n_value字段保存下一个文件项的符号索引。 该n_name字段是文件的名称。
C_BINCL 指定包含头文件的开头。 该n_value字段是对象文件中从包含文件到第一行号的行号字节偏移量。
C_EINCL 指定包含头文件的结尾。 该n_value字段是对象文件中从包含文件到最后一个行号的行号字节偏移量。
c_info comment 部分中指定字符串的位置。 该n_value字段是指定 STYP_INFO 部分中字节字符串的偏移量。 字符串前面有一个 4 字节length。 该n_name字段由绑定程序保留。 此字段中应用程序定义的唯一名称可用于仅过滤对那些针对应用程序的注释部分字符串的访问权。
C_矮星 指定 DWARF 部分中适用于当前 C_FILE 符号的部分。 该n_value字段包含与此符号表示的部分的部分的偏移量。 该n_scnlenSECT 辅助条目中的字段包含此符号表示的部分的长度。

以下是仅出于符号调试目的而存在的存储类:

描述
C_BCOMM 指定公共块的开头。 该n_value字段无意义; 名称是公共块的名称。
C_ECOML 指定公共块的本地成员。 该n_value字段是公共块中的字节偏移量。
C_电子商务 指定公共块的结束。 该n_value字段是无意义的。
C_BSTAT 指定静态块的开头。 该n_valuefield 是包含静态符号的 csect 的符号表索引; 名称为 .bs。
C_ESTAT 指定静态块的结束。 该n_value字段无意义; 名称为 .es。
C_DECL 指定对象的声明 (类型声明)。 该n_value字段未定义。
C_ENTRY 指定备用条目 (FORTRAN) ,并具有相应的 C_EXTC_弱文本 符号。 该n_value字段未定义。
C_FUN 指定函数或过程。 可能具有相应的 C_EXTC_弱文本 符号。 该n_value字段在包含的 csect 中是字节偏移量。
C_GSYM 指定全局变量,并具有相应的 C_EXTC_弱文本 符号。 该n_value字段未定义。
C_LSYM 指定在堆栈上分配的自动变量。 该n_value字段是相对于堆栈帧 (依赖于平台) 的字节偏移量。
C_PSYM 指定在堆栈上分配的子例程的自变量。 该n_value字段是相对于堆栈帧 (依赖于平台) 的字节偏移量。
C_RSYM 指定寄存器变量。 该n_value字段是寄存器号。
C_RPSYM 指定存储在寄存器中的函数或过程的自变量。 该n_value字段是存储参数的寄存器号。
C_STSYM 指定静态分配的符号。 该n_value字段是包含 C_BSTAT 条目所指向的 csect 内的字节偏移量。
C_GTLS 指定具有相同名称的全局线程局部变量并跟在 C_EXTC_弱文本 符号之后。 该n_value字段未定义。
C_STTLS 指定静态线程局部变量,并跟在具有相同名称的 C_HIDEXT 符号之后。 该n_value字段未定义。

有关 XCOFF 文件格式的常规信息,请参阅 "XCOFF 对象文件格式" 。 有关符号表的更多信息,请参阅 "符号表信息"

有关调试的信息,请参阅 "调试部分"

字符串表

在 XCOFF32中,字符串表包含长度超过 8 字节的符号的名称。 在 XCOFF64中,字符串表包含所有符号的名称。 如果存在字符串表,那么前 4 个字节包含字符串表的长度 (以字节计) ,包括此长度字段的长度。 表的其余部分是以 null 结束的 ASCII 字符串序列。 如果n_zeroes符号表条目中的字段为 0 ,那么n_offset字段将字节偏移量提供给符号名称的字符串表。

如果未使用字符串表,那么可以将其全部省略,或者可以使用仅由长度字段 (包含值 0 或 4) 组成的字符串表。 首选值 4。 下表显示了字符串表组织。

表 23. 字符串表组织
偏移量 长度 (以字节计) 描述
0 4 字符串表的长度。
4 n 符号名称字符串,以 null 结束。
    每个符号名称的字段重复。

有关 XCOFF 文件格式的常规信息,请参阅 "XCOFF 对象文件格式"

dbx 稳定弦

调试部分包含符号调试器 stabstrings (符号表字符串)。 它由编译器和汇编程序生成。 它提供符号属性信息以供符号调试器使用。

请参阅 "调试部分" 以获取常规讨论。

Stabstring 终端符号

在 stabstring 语法中,有五种类型的终端符号,都是用大写字母写的。 以下列表中的正则表达式描述了这些符号:
注: [] (括号) 表示一个实例, [] * (括号星号) 表示零个或多个实例, [] + (括号加号) 表示一个或多个实例, () (括号) 表示零个或一个实例, .* (点星号) 表示零个或多个字节的序列, | (管道) 表示替代项。
符号 正则表达式
名称 [^ ;: ' "] (名称由任何非空字符集组成,不包括 ;: '"。)
字符串 '.*' | ".*",其中可以在字符串中使用 \"\'\\

在字符串中, \ (反斜杠字符) 可能具有特殊含义。 如果 \ 后面的字符是另一个 \ ,那么将忽略其中一个反斜杠。 如果下一个字符是用于当前字符串的引号字符,那么该字符串将解释为包含嵌入的引号。 否则,将按字面解释该 \。 但是,如果结束引号是 stabstring 中的最后一个字符,并且在紧接引号之前出现 \ ,那么将按字面意思解释 \。 建议不要使用此选项。

\ 必须仅在以下情况下使用引号:

  • \ 是字符串中的最后一个字符 (为了避免将右引号转义)。
  • \ 后跟当前引号字符。
  • \ 后跟另一个 \。

仅当单个字符串同时包含单引号和双引号时,才需要转义引号。 否则,应该使用字符串中未包含的引号字符对字符串进行引号。

字符串可以包含嵌入式空字符,因此处理 stabstrings 的实用程序必须使用 length 字段来确定 stabstring 的长度。

INTEGER (-) [0-9] +
十六进制整数 [0-9A-F] +

十六进制数字 A-F 必须为大写。

REAL [ H | D |DD]([ +- ][ 0 -9 ]+(. )[ 0 -9 ]*([ eEqQ ]( +- )[ 0 -9 ]+) | ( +- ) INF | QNAN | SNAN )

Stabstring 语法

REAL 前面可以有空格, STRING 可以包含任何字符,包括空字符和空白字符。 否则,在 stabstring 中没有空字符或空白字符。

可以跨多个符号表条目拆分长的 stabstrings ,以方便处理。 在 stabstring 语法中, # (井号) 指示可以继续使用 stabstring 的点。 使用 "?" 或 "?" 指示延续 (问号) 或 \ 作为字符串中的最后一个字符。 stabstring 的下一部分位于下一个符号表条目的名称中。 如果生产的备用项为空,那么语法将显示关键字/*EMPTY*/。

以下列表包含 stabstring 语法:

刺字串:
stabstring 的基本结构:
名称: Class
后跟对象分类的对象的名称
:类
未命名的对象分类。
Class:
对象分类:
c = 常量 ;
常量对象
NamedType
用户定义的类型和标记
PARAMETER
子程序的自变量
PROCEDURE
子程序声明
变量
程序中的变量
标号
标签对象。
常量:
常量声明:
b OrdValue
布尔常量
c OrdValue
字符常量 (character constant)
e TypeID OrdValue
枚举常量
i 整数
整数常数 (integer constant)
真实
十进制或二进制浮点常量
s 字符串
字符串常量 (string constant)
C REAL , REAL
复数常量 (complex constant)
S TypeID NumElements NumBits BitPattern
设置常量。
OrdValue:
关联的数字值 :INTEGER
NumElements:
集合中的元素数 :INTEGER
NumBits:
项中的位数 :INTEGER
NumBytes:
项中的字节数 :INTEGER
BitPattern:
十六进制表示,最多 32 个字节 :HEXINTEGER
NamedType:
用户定义的类型和标记:
t TypeID
用户定义的类型 (TYPE 或 typedef) ,不包括对 T TypeID 有效的类型
T TypeID
Struct , union , class 或 enumeration 标记
参数:
过程或函数的自变量:
TypeID
在常规寄存器中按引用传递
p TypeID
通过堆栈上的值传递
v TypeID
由堆栈上的引用传递
C TypeID
由堆栈上的值传递的常量
D TypeID
在浮点寄存器中按值传递
R TypeID
在常规寄存器中按值传递
X TypeID
在向量寄存器中按值传递
过程:
过程或函数声明:
处理器
当前作用域限定级别的过程
处理器 ,名称 :NAME
名为1st NAME的函数,作用域限定于2nd NAME,其中2nd NAME与当前作用域不同。
变量:
程序中的变量:
TypeID
类型为 TypeID 的本地 (自动) 变量
d TypeID
类型为 TypeID 的浮动寄存器变量
hTypeID
静态线程-类型为 TypeID 的局部变量
r TypeID
注册类型为 TypeID 的变量
x TypeID
类型为 TypeID 的向量寄存器变量
G TypeID
类型为 TypeID 的全局 (外部) 变量
H TypeID
类型为 TypeID 的全局 (外部) 线程局部变量
S TypeID
类型为 TypeID 的模块变量 (C 静态全局)
V TypeID
拥有类型为 TypeID 的变量 (C 静态本地)
Y
FORTRAN 指针变量
Z TypeID 名称
FORTRAN 点变量
标签:
标签:
L
标签名称。
过程:
不同类型的功能和过程:
f TypeID
类型为 TypeID 的专用函数
g TypeID
通用函数 (FORTRAN)
m TypeID
模块 (Modula-2, ext. 帕斯卡尔)
J TypeID
类型为 TypeID 的内部函数
F TypeID
类型为 TypeID 的外部函数
I
(大写 i) 内部程序
P
external procedure(外部过程)
Q
专用过程
TypeID:
类型声明和标识:
INTEGER
先前定义的类型的类型号
INTEGER = TypeDef
TypeDef 描述的新类型号
INTEGER = TypeAttrs TypeDef
具有特殊类型属性的新类型
TypeAttrs:
@ TypeAttrList ;
注: 类型属性 (TypeAttrs) 是与类型关联的额外信息,例如对齐约束或指针检查语义。 dbx 程序仅识别 size 属性和 packed 属性。 size 属性表示数组中已填充元素的总大小。 packed 属性指示类型是打包类型。 dbx将忽略任何其他属性。
TypeAttrList:
特殊类型属性的列表:
TypeAttrList ;
@ TypeAttr TypeAttr
TypeAttr:
特殊类型属性:
a 整数
对齐边界
s 整数
大小 (以位计)
p 整数
指针类 (用于检查)
P
打包类型
其他
将完全跳过未覆盖的任何内容
TypeDef:
对象的基本描述:
INTEGER
先前定义的类型的类型号
b TypeID; # NumBytes
Pascal 空间类型
c TypeID; # NumBits
复杂类型 TypeID
d TypeID
类型为 TypeID 的文件
e EnumSpec;
枚举类型 (缺省大小, 32 位)
g TypeID; # NumBits
浮点类型的大小 NumBits
D TypeID; # NumBits
十进制浮点型大小 NumBits

对于 i 类型, ModuleName 是指从中导入模块的 Modula-2 模块。

i 名称 :NAME;
导入类型ModuleName:Name
i NAME: NAME , TypeID ;
进口类型 ModuleName:Name 的类型 TypeID
k TypeID
C++ 常量类型
l; #
用法-索引;特定于 COBOL
m OptVBaseSpec OptMultiBaseSpec TypeID: TypeID TypeID
指向成员类型的 C++ 指针; 第一个 TypeID 是成员类型; 第二个是类的类型
n TypeID; # NumBytes
字符串类型,最大字符串长度由 NumBytes 指示
o 名称;
不透明类型
o NAME , TypeID
具有 TypeID 定义的不透明类型
w TypeID
宽字符
z TypeID; # NumBytes
Pascal gstring 类型
C 使用情况
COBOL 图片
NumBytes; # PicSize
(大写字母 i) 索引是类型;特定于 COBOL
K CobolFileDesc;
COBOL 文件描述符
M TypeID ; 已绑定的数量
TypeID 的多个实例类型,长度由 Bound 指示
N
Pascal 字符串指针
S TypeID
类型为 TypeID 的集合
* TypeID
类型为 TypeID 的指针
& TypeID
C++ 引用类型
V TypeID
C++ 易失性类型
Z
C++ 省略号参数类型
数组子范围 ProcedureType
用于函数类型而不是声明
RECORD
记录,结构,并集或组类型
EnumSpec:
枚举标量列表:
EnumList
枚举类型 (C 和其他语言)
TypeID : EnumList
具有重复整数类型的 C++ 枚举类型
EnumList:枚举
EnumList 枚举
枚举:
枚举标量描述: NAME : OrdValue , #
数组:
数组描述:
TypeID ; # TypeID
数组;FirstTypeID是索引类型
TypeID
打开 TypeID 的数组
D INTEGER,TypeID
TypeID 的 N 维动态数组
E INTEGER , TypeID
TypeID 的 N 维动态子数组
O INTEGER , TypeID
新建开放式阵列
P TypeID; # TypeID
打包数组
子范围:
子范围描述:
r TypeID ; # Bound ; # 绑定
子范围类型 (例如, char , int , \ ,) ,下限和上限
绑定:
上下限描述:
INTEGER
常量界限
边界类型 INTEGER
变量或动态界限; 值是界限的地址或偏移量
J
边界不可确定 (无边界)
边界类型:
可调整的子范围描述:
A
由堆栈上的引用传递的边界
S
由静态存储器中的值传递的边界
T
由堆栈上的值传递的边界
a
由寄存器中的引用传递的边界
t
由寄存器中的值传递的边界
ProcedureType:
函数变量(第一种类型仅限C语言;其余 Modula-2 类型支持C语言与Pascal语言)
f TypeID;
函数返回类型 TypeID
f TypeID NumParams ; TParamList ;
返回类型 TypeID 的 N 个参数的函数
p NumParams; TParamList;
N 个参数的过程
RNumParams NamedTParamList
Pascal 子例程参数
F TypeID, NumParams; NamedTParamList
Pascal 函数参数
NumParams:
例程中的参数数:

整数

TParamList:
Modula-2 函数变量中的参数类型:
TParam
参数类型和传递方法
TParam:
类型和传递方法

TypeID , PassBy ; #

NamedTParamList:
Pascal-例程变量中的参数类型:/*EMPTY*/ NamedTPList
NamedTPList:
NamedTParam NamedTPList NamedTParam
NamedTParam:
指定的类型和传递方法: Name : TypeID PassBy InitBody ; # : TypeID PassBy InitBody ; # 未命名的参数
记录:
结构声明的类型:
  • s NumBytes # FieldList ;
  • 结构或记录定义
  • u NumBytes # FieldList ;
  • 连接
  • v NumBytes # FieldListVariantPart ;
  • 变体记录
  • Y NumBytesClassKeyOptPBVOptBaseSpecList ( ExtendedFieldListOptNameResolutionList ;
  • C++ 类
  • G 重新定义 , n NumBits # FieldList ;
  • COBOL 无条件组

Gn NumBitsFieldList ;

  • G Redefinition, c NumBits#CondFieldList
  • COBOL 条件语句组

Gc NumBits CondFieldList

OptVBaseSpec:
v
ptr-to-mem 类具有虚拟库。
/*空*/
类没有虚拟基础。
OptMultiBaseSpec:
m
类是多基类。
/*空*/
类不是多基类。
OptPBV:
V
类始终按值传递。
/*空*/
类从不按值传递。
ClassKey:
s
struct
u
并集 (union)
c
class
OptBaseSpecList:
/*EMPTY*/BaseSpecList
BaseSpecList:
BaseSpec BaseSpecList , BaseSpec
BaseSpec:
VirtualAccessSpec BaseClassOffset : ClassTypeID
BaseClassOffset:
INTEGER
基本记录偏移量 (以字节计)
ClassTypeID:
TypeID
基类类型标识
VirtualAccessSpec:
v AccessSpec
虚拟
v
虚拟

AccessSpec

/*空*/

GenSpec:
c
编译器生成的

/*空*/

AccessSpec:
我 #
专用
o #
受保护
U #
公共
AnonSpec:
a
匿名工会成员

/*空*/

VirtualSpec:
五普
纯虚拟
v
虚拟
/*空*/
ExtendedFieldList:
ExtendedFieldList ExtendedField/*EMPTY*/
ExtendedField:
GenSpec AccessSpec AnonSpec DataMember GenSpec VirtualSpec AccessSpec OptVirtualFuncIndex MemberFunction AccessSpec AnonSpec NestedClass AnonSpec FriendClass AnonSpec FriendFunction
DataMember:
MemberAttrs : 字段 ;
MemberAttrs:
IsStatic IsVtblPtr IsVBasePtr
IsStatic:
/*空*/
s
成员为静态成员。
IsVtblPtr:
/*空*/
p 整数名称
成员是 vtbl 指针; NAME 是 v-table 的外部名。
IsVBasePtr:
/*空*/
b
成员是 vbase 指针。
r
成员是 vbase 自指针。
成员函数:
[ FuncType MemberFuncAttrs:NAME: TypeID; #
MemberFuncAttrs:
IsStatic IsInline IsConst IsVolatile
IsInline:
/*空*/
i
内联函数 (inline function)
IsConst:
/*空*/
k
const 成员函数
IsVolatile:
/*空*/
V
易失性成员函数
NestedClass:
N TypeID ; #
FriendClass:
( TypeID ; #
FriendFunction:
名称 TypeID ;#
OptVirtualFuncIndex:
/*EMPTY*/整数
FuncType:
f
成员函数 (member function)
c
构造函数
d
析构函数
InitBody:
字符串/*EMPTY*/
OptNameResolutionList:
/*EMPTY*/) NameResolutionList
NameResolutionList: NameResolution
NameResolution , NameResolutionList
NameResolution: MemberName : ClassTypeID
名称由编译器解析。
成员姓名
名称不明确。
MemberName:
名称
FieldList:
结构内容描述:
字段
/*空*/
FieldList 字段
记录或联合的成员。
字段:
结构成员类型描述:

NAME : TypeID BitOffset NumBits ; #

VariantPart:
变体记录的变体部分:
[ Vtag VFieldList ]
变体描述
VTag:
变体记录标记:
( 字段 )
变体记录的成员
(名称:; #
变体密钥名称
VFieldList:
变体记录内容描述:
VList VFieldList VList
变体记录的成员
VList:
变体记录字段:
VField VField VariantPart
变体记录的成员
VField:
变体记录成员类型描述:
( VRangeList : FieldList
具有字段列表的变体
VRangeList:
变体字段标签列表:
VRange VRangeList VRange
变体记录的成员
VRange:
变体字段描述:
b OrdValue
布尔变体
c OrdValue
字符变体
e TypeID OrdValue
枚举变体
i 整数
整数变体
r TypeID; 边界; 边界
子范围变体
CondFieldList:
Conditions,#FieldList #
Conditions:
/*Empty*/ 条件
BitOffset:
从结构开头开始的偏移量 (以位计) :INTEGER
用法:
Cobol 用法描述: PICStorageType NumBits EditDescription PicSize ; 重新定义 PICStorageType NumBits EditDescription PicSize ; PICStorageType NumBits EditDescription PicSize , # Condition ; Redefinition PICStorageType NumBits EditDescription PicSize , # 条件 ;
重新定义:
Cobol 重新定义: r NAME
PICStorageType:
Cobol PICTURE 类型:
a
字母
b
字母,已编辑
c
字母数字 (alphanumeric)
d
字母数字,已编辑
e
数字,有符号,有尾随,包括
f
数字,带符号,尾部,分隔
g
数字,带符号,前导,包括
h
数字,带符号,前导和分隔
i
数字,带符号,缺省值, comp
j
数字,无符号,缺省值, comp
k
数字,压缩,十进制,带符号
l
数字,压缩,十进制,无符号
m
数字,无符号, comp-x
n
数字,无符号, comp-5
o
数字,带符号, comp-5
p
数字,已编辑
q
数字,无符号
s
已建立索引项
t
指针
EditDescription:
Cobol 编辑描述:
字符串
编辑 alpha PIC 中的字符
INTEGER
数字 PIC 中的小数点位置
PicSize:
COBOL 描述长度:
INTEGER
数字子句中重复的 "9" 的数目,或已编辑的数字的编辑格式的长度
条件:
条件变量描述:

NAME : INTEGER = q ConditionType ValueList ; #

ConditionType:
条件描述:

ConditionPrimitive , KanjiChar

ConditionPrimitive:
条件的基本类型:
n 符号 DecimalSite
数字条件
a
字母数字条件
f
象征条件
符号:
对于带有显式符号的类型:
+
正面
-
负面
[^+-]
未指定
DecimalSite:
从左到右默示小数点的位数:

INTEGER

KanjiChar:
0 (仅当值为 INTEGER 时)
ValueList
与条件名称关联的值
ValueList 值
VALUE
与条件名称关联的值:
INTEGER: ArbitraryCharacters #
整数指示字符串的长度
CobolFileDesc:
COBOL 文件描述: 组织 AccessMethod NumBytes
组织:
COBOL 文件描述组织:
i
已建立索引
l
行顺序
r
相对
s
顺序
AccessMethod:
COBOL 文件描述访问方法:
d
动态
o
排序
r
随机值
s
顺序
PassBy:
参数传递方法:
INTEGER
0 = 按引用传递; 1 = 按值传递