XCOFF 对象文件格式
用途
扩展公共对象文件格式 (XCOFF) 是操作系统的对象文件格式。 XCOFF 把标准公共目标文件格式(COFF)和 TOC 模块格式概念结合起来,提供在一个目标文件内动态链接和置换单元。 XCOFF 的变体用于 64 位对象文件和可执行文件。
XCOFF 是机器映像对象和可执行文件的正式定义。 这些对象文件由语言处理器 (汇编程序和编译器) 和绑定程序 (或链接编辑器) 生成,并且主要由绑定程序和系统装入程序使用。
XCOFF 可执行文件的缺省名称为 a.out。
请阅读以下信息以了解有关 XCOFF 对象文件的更多信息:
编写使用 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 个字节。 该结构包含下表中显示的字段。
| 字段名称和描述 | XCOFF32 | XCOFF64 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
字段定义
| 项 | 描述 |
|---|---|
| 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_EXEC 在 aouthdr.h中定义。) |
| f_flags | 指定用于描述对象文件类型的标志的位掩码。 以下信息定义了标志:
|
辅助头 (aouthdr.h)
辅助头包含与系统相关和与实现相关的信息,这些信息用于装入和执行模块。 辅助头中的信息使系统装入程序在执行时必须处理的文件量最小化。
绑定程序生成辅助头以供系统装入程序使用。 对于不需要装入的对象文件,不需要辅助头。 当编译器和汇编程序生成辅助头时,绑定程序将忽略这些头。
辅助头的 C 语言结构在 aouthdr.h 文件中定义。 辅助头包含下表中显示的字段。
| 字段名称和描述 | XCOFF32 | XCOFF64 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
字段定义
以下信息定义辅助头字段。 对于具有两个标签的条目,括号中的标签是备用原始 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 锚点的地址。 入口点函数描述符从其包含部分开始的偏移可以计算如下: 其中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 字符串。 系统装入程序可识别以下模块类型:
|
| 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对齐:
|
| 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 定义中。
|
通常,对象文件可能包含给定类型的多个部分,但在可装入模块中,必须正好有一个.text,.data,.bss和.loader部分。 可装入对象可能还具有一个.tdata部分和一个.tbss部分。
节标题 (scnhdr.h)
XCOFF 文件的每个部分都具有相应的部分标题,尽管某些部分标题可能没有相应的原始数据部分。 节头为 XCOFF 文件中包含的每个节提供标识和文件访问信息。 XCOFF32 文件中的每个节头的长度为 40 个字节,而 XCOFF64 节头的长度为 72 个字节。 可以在 scnhdr.h 文件中找到节头的 C 语言结构。 节标题包含下表中显示的字段。
| 字段名称和描述 | XCOFF32 | XCOFF64 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
字段定义
以下信息定义了节标题字段:
| 项 | 描述 |
|---|---|
| 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,从逻辑上删除了段头。
有效的位值为:
|
| 项 | 描述 |
|---|---|
|
|
| s_flags持续 | 有效的位值为:
|
节和节标题
定义了节标题以提供有关 XCOFF 文件内容的各种信息。 处理 XCOFF 文件的程序将仅识别某些有效部分。
请参阅以下信息以了解有关 XCOFF 文件部分的更多信息:
当前应用程序不使用s_name字段以确定区段类型。 然而,传统名称由系统工具使用,如下表所示。
| 描述 | 允许多个? | 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_size和s_scnptr在溢出部分头中,字段的值为 0。 该s_relptr和s_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 语言结构。
装入程序头字段定义
下表描述了装入程序部分的头字段定义。
| 字段名称和描述 | XCOFF32 | XCOFF64 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
以下信息定义装入程序部分的头字段:
| 项 | 描述 |
|---|---|
| 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 从重置表项中引用。
| 字段名称和描述 | XCOFF32 | XCOFF64 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
符号表字段为:
| 项 | 描述 |
|---|---|
| l_name | (仅XCOFF32 ) 指定长度为 8 字节或更小的 8 字节空填充符号名称。 否则,该字段将被视为用于访问符号名称的以下两个 4 字节整数:
|
| l_offset | (仅限XCOFF64 ) 此字段与l_offsetXCOFF32中的字段。 |
| l_value | 指定符号的虚拟地址 |
| l_scnum | 指定包含符号的 XCOFF 节的编号。 如果未定义或导入符号,那么节号为 0。 否则,节号指.text,.data,或.bss部分。 节标题以 1 开头进行编号。 |
| l_smtype | 指定符号类型,导入标志,导出标志和输入标志。 位 0-4 是如下定义的标志位: 位 5-7 构成具有以下定义的 3 位符号类型字段:
|
|
指定符号的存储映射类,如 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 WIDEXT和 C_HIDEXT 符号" 。 |
|
指定导入文件标识字符串。 此整数是导入文件标识字符串在装入程序部分的导入文件标识名称字符串表中的位置的有序值。 对于导入的符号,此字段中 0 的值将该符号标识为延迟导入到系统装入程序。 延迟导入是一个符号,在处理装入程序之后,其地址可以保持未解析状态。 如果未导入符号,那么此字段的值必须为 0。 |
|
指定参数类型检查字符串的偏移量。 字节偏移量来自装入程序部分字符串表的开头。 字节偏移量指向参数类型检查字符串的第一个字节 (而不是其长度字段)。 有关参数 type-check 字符串的更多信息,请参阅 "Type-Check Section" 。 0 的值l_parm字段指示此符号不存在参数类型检查字符串,并且该符号将被视为具有通用散列。 |
装入程序重定位表字段定义
装入程序部分重定位表结构包含系统装入程序在装入可执行 XCOFF 文件时需要正确重定位的所有重定位信息。 loader.h 文件定义重定位表字段。 装入程序部分重定位表中的每个条目在 XCOFF32中的长度为 12 个字节,在 XCOFF64中的长度为 16 个字节。 l_vaddr, l_symndx和l_rtype 字段与 reloc.h 文件中定义的常规重定位条目的相应字段具有相同的含义。 有关重定位条目的更多信息,请参阅 XCOFF 文件的重定位信息 (reloc.h)。
| 字段名称和描述 | XCOFF32 | XCOFF64 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 的索引。 |
装入程序导入文件标识名称表定义
模块的装入程序部分导入文件标识名称字符串提供了系统装入程序为了成功装入模块而必须装入的从属模块的列表。 但是,此列表不包含指定模块所依赖的模块的名称。
| 偏移量 | 长度 (以字节计) | 名称和描述 |
|---|---|---|
| 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 字节长度字段组成。
| 偏移量 | 长度 (以字节计) | 描述 |
|---|---|---|
| 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_WIDEXT 或 C_HIDEXT 符号表条目的符号表索引。 通过函数辅助符号表项从符号表引用异常表中的条目。 有关此条目的更多信息,请参阅 "csect 辅助条目用于 C_EXT , C_WIDEXT 和 C_HIDEXT 符号。"
可在 exceptab.h 文件中找到异常部分条目的 C 语言结构。
异常部分条目包含下表中显示的字段。
| 字段名称和描述 | XCOFF32 | XCOFF64 |
|---|---|---|
|
|
|
|
|
|
|
|
|
| 字段名称和描述 | XCOFF32 | XCOFF64 |
|---|---|---|
|
|
|
|
|
|
|
|
|
字段定义
以下定义了异常部分中列出的字段:
| 项 | 描述 |
|---|---|
| e_symndx | 包含整数 (覆盖e_paddr字段)。 如果在请求中未找到e_reason字段为 0 ,此字段是函数的符号表索引。 |
| e_paddr | 包含虚拟地址 (覆盖e_symndx字段)。 如果在请求中未找到e_reason字段非零,此字段是陷阱指令的虚拟地址。 |
| e_lang | 指定源语言。 以下列表定义了e_lang。
|
| 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_FILE, C_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 语言结构。 重定位条目包含下表中显示的字段。
| 字段名称和描述 | XCOFF32 | XCOFF64 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
区段的重定位条目必须采用升序地址顺序。
(装入程序部分包含系统装入程序使用的一组重定位条目; 因此每个重定位条目中都需要一个节号来标识需要修改的节。)
字段定义
| 项 | 描述 |
|---|---|
| r_vaddr | 指定需要绑定程序修改的值的虚拟地址。 需要从包含数据的部分开始修改的数据的字节偏移值可按如下所示计算: offset_in_section = r_vaddr - s_paddr |
| r_symndx | 在 XCOFF 符号表中指定基于零的索引以查找引用的符号。 符号表条目包含用于计算要在以下位置应用的修改值的地址:r_vaddr重定位地址。 |
| r_rsize | 指定重定位大小和符号。 其内容详见以下列表:
|
| r_rtype | 指定 8 位重定位类型字段,该字段向绑定程序指示要用于计算修改值的重定位算法。 此值将应用于由以下对象指定的可重定位引用位置:r_vaddr。 定义了以下重定位类型:
|
| r_rtype持续 |
|
| r_rtype持续 |
|
其他重定位功能
标准做法是仅保留未解析的引用或不同部分之间的引用的重定位信息。 解析引用后,将废弃重定位信息。 这足以用于增量绑定和固定地址空间模型。 为了提供重新绑定和处理可重定位地址空间模型的功能,不会从 XCOFF 文件中废弃重定位信息。
有关 XCOFF 文件格式的常规信息,请参阅 "XCOFF 对象文件格式" 。
有关重定位字段表定义的更多信息,请参阅装入程序部分中的 "重定位表字段定义" 。
XCOFF 文件的行号信息 (linenum.h)
行号条目由符号调试器用于在源级别调试代码。 存在时,可以具有符号调试器断点的每个源行都有一个行号条目。 行号按函数分组。 每个函数的开头都由l_lnno包含值 0 的字段。 第一个领域,l_symndx,是函数的 C_EXT , C_WIDEXT或 C_HIDEXT 符号表条目的符号表索引。
每个行号项的长度为 6 个字节。 可在 linenum.h 文件中找到行号条目的 C 语言结构。 行号条目包含下表中显示的字段。
| 字段名称和描述 | XCOFF32 | XCOFF64 |
|---|---|---|
|
|
|
|
|
|
| 字段名称和描述 | XCOFF32 | XCOFF64 |
|---|---|---|
|
|
|
|
|
|
字段定义
以下列表定义行号条目:
| 项 | 描述 |
|---|---|
| l_symndx | 指定函数名的符号表索引 (覆盖l_paddr字段)。 如果在请求中未找到l_lnno字段为 0 ,将使用此字段解释。 |
| l_paddr | 指定与行号关联的代码的第一个指令的虚拟地址 (覆盖l_symndx字段)。 如果在请求中未找到l_lnno字段不是 0 ,将使用此字段解释。 |
| l_lnno | 指定相对于函数开始的行号或 0 以指示函数开始。 |
有关 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。 下表显示了符号表中每个符号的固定格式部分的结构。
| 字段名称和描述 | XCOFF32 | XCOFF64 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
字段定义
以下定义符号表条目字段:
| 项 | 描述 |
|---|---|
| n_name | 仅由 XCOFF32 使用。 指定 8 字节的空填充符号名称或符号调试器 stabstring。 存储类字段用于确定该字段是符号名称还是符号调试器 stabstring。 按照约定,具有高位位的存储类值指示此字段是符号调试器 stabstring。 如果 XCOFF32 符号名称超过 8 字节,那么该字段将解释为以下两个字段:
|
| n_offset | 对于 XCOFF64: 指定字符串表中符号名称的字节偏移量,或者.debug部分。 字节偏移量相对于字符串表的开始或.debug部分。 字节偏移值 0 是空或长度为零的符号名称。 (仅适用于 XCOFF32 ,与n_zeroes. 请参阅上面的条目。) |
| n_value | 指定符号值。 符号值字段的内容与存储类相关,如以下定义中所示:
|
| n_scnum | 指定与下列其中一个符号关联的节号:
|
| n_type | 此字段的使用取决于符号的存储类。 对于 C_FILE 符号,请参阅 " C_FILE 符号的文件辅助条目" 。 对于 C_EXT, C_HIDEXT和 C_WIDEXT 符号,n_type字段在 XCOFF32中有两种解释,在 XCOFF64中有一种解释。 旧解释在 XCOFF32 中使用 (如果o_vstamp辅助头中的字段为 1。 在旧的 XCOFF32 解释中,如果符号是函数,那么可以设置位 10 (0x0020)。 否则,位 10 应该为 0。 其余位在 COFF 文件中定义以表示类型信息,并且不再使用。 在 XCOFF64 和新的 XCOFF32 解释中, n_type字段用于符号类型和可视性,如下所示:
ld 命令中描述了符号可视性。 注: 对于所有其他存储类,n_type字段保留以供将来使用,并且应该包含 0。
|
| n_sclass | 指定符号的存储类。 storclass.h 和 dbxstclass.h 文件包含存储类的定义。 请参阅 "符号表字段内容 (按存储类)" 以获取更多信息。 |
| n_numaux | 指定符号的辅助条目数。 在 XCOFF64中,辅助符号具有标识类型字段,但在 XCOFF32中,没有类型字段。 因此,如果一个符号需要多个辅助条目,那么辅助条目的顺序由约定确定。 |
有关 XCOFF 文件格式的常规信息,请参阅 "XCOFF 对象文件格式" 。
符号表辅助信息
符号表包含用于提供符号补充信息的辅助条目。 符号的辅助项跟在其符号表项之后。 每个辅助项的长度与符号表项 (18 字节) 相同。 辅助条目的格式和数量取决于存储类 (n_sclass) 和类型 (n_type) 符号表项。
在 XCOFF32中,存储类为 C_EXT , C_WIDEXT 或 C_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 ,那么不会提供有关源语言的信息。
|
字段定义
下面定义了上面列出的字段:
| 项 | 描述 |
|---|---|
| x_fname | 指定源文件名或与编译器相关的字符串。 如果文件名或字符串的长度超过 8 字节,那么该字段将解释为以下两个字段:
|
| x_ftype | 指定源文件字符串类型。
|
| (无名称) | 已保留。 此字段必须包含 0 的 2 字节。 |
| x_auxtype | (仅限XCOFF64 ) 指定辅助条目的类型。 包含此辅助条目的 _AUX_FILE。 |
如果未使用文件辅助条目,那么符号名称是源文件的名称。 如果使用了文件辅助项,那么符号名称应该是.file,并且第一个文件辅助条目 (按约定) 包含源文件名。 给定符号表项允许多个文件辅助项。 该n_numaux字段包含文件辅助条目数。
C_EXT , C_WIDEXT 和 C_HIDEXT 符号的 csect 辅助条目
csect 辅助条目标识 csects (节定义) ,入口点 (标签定义) 和外部引用 (标签声明)。 对于存储类值为 C_EXT , C_WIDEXT或 C_HIDEXT的每个符号表条目,都需要 csect 辅助条目。 请参阅 "符号表条目 (syms.h)" 以获取更多信息。 按照约定, XCOFF32 文件中的 csect 辅助条目必须是具有多个辅助条目的任何外部符号的最后一个辅助条目。 可以在 syms.h 文件的 x_csect 结构中找到 csect 辅助条目的 C 语言结构。
| 字段名称和描述 | XCOFF32 | XCOFF64 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
字段定义
| 项 | 描述 |
|---|---|
| x_scnlen | 指定依赖于的含义x_smtyp如下所示:
|
| 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 | 指定符号对齐方式和类型:
|
| x_smclas | 指定 csect 存储映射类。 此字段允许绑定程序按其存储映射类排列 csects。 该x_smclas仅当位 5-7 的值为以下值时,才会使用此字段:x_smtyp字段为 XTY_SD 或 XTY_CM。 以下存储映射类是只读的,通常映射到.text部分:
以下存储映射类是读/写类,通常映射到.data或.bss部分:
|
| x_smclas持续 |
|
| x_smclas持续 |
|
| x_smclas持续 |
以下存储映射类是读写的,并且映射到.tdata部分:
以下存储映射类是读写的,并且映射到.tbss部分:
|
| x_stab | 保留 (未用于 64 位)。 |
| x_snstab | 保留 (未用于 64 位)。 |
C_EXT , C_WIDEXT 和 C_HIDEXT 符号的辅助条目
辅助符号表条目在 XCOFF 中定义,以包含与定义的函数相关联的引用和大小信息。 这些辅助条目由编译器和汇编程序生成,供符号调试器使用。 在 XCOFF32中,函数辅助符号表条目包含必需的信息。 在 XCOFF64中,可能需要一个函数辅助条目和一个执行辅助条目。 当为单个 C_EXT , C_WIDEXT或 C_HIDEXT 符号生成两个辅助条目时,x_size和x_endndx字段必须具有相同的值。
下表中定义了函数辅助符号表项。
| 字段名称和描述 | XCOFF32 | XCOFF64 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
字段定义
下面定义了 "功能辅助项格式" 表中列出的字段:
| 项 | 描述 |
|---|---|
| x_exptr | (仅限XCOFF32 ) 此字段是指向异常表条目的文件指针。 该值是从 XCOFF 对象文件开始的字节偏移量。 在 XCOFF64 文件中,异常表偏移量位于异常辅助符号表条目中。 |
| x_fsize | 指定函数的大小 (以字节计)。 |
| x_lnnoptr | 指定指向行号的文件指针。 该值是从 XCOFF 对象文件开始的字节偏移量。 |
| x_endndx | 指定此函数之外的下一个条目的符号表索引。 |
下表中显示了仅在 XCOFF64 中定义的异常辅助符号表条目。
| 偏移量 | 长度 | 名称和描述 |
|---|---|---|
| 0 | 8 |
|
| 8 | 4 |
|
| 12 | 4 |
|
| 16 | 1 |
|
| 17 | 1 |
|
字段定义
以下定义 "异常辅助条目格式" 表中列出的字段:
| 项 | 描述 |
|---|---|
| x_exptr | 此字段是指向异常表条目的文件指针。 该值是从 XCOFF 对象文件开始的字节偏移量。 |
| x_fsize | 指定函数的大小 (以字节计)。 |
| x_endndx | 指定此函数之外的下一个条目的符号表索引。 |
C_BLOCK 和 C_FCN 符号的块辅助条目
在 XCOFF 中定义符号辅助符号表项以提供与函数的开始和结束块相关联的信息。 符号辅助符号表项由编译器生成,供符号调试器使用。
| 字段名称和描述 | XCOFF32 | XCOFF64 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
字段定义
下面定义了上面的字段:
| 项 | 描述 |
|---|---|
| (无名称) | 已保留。 |
| x_lnnohi | 对于 XCOFF32,指定源文件行号的高阶 16 位。 |
| x_lnno | 指定源文件的行号。 此字段的最大值为 65535 (对于 XCOFF64 ) 和 232 (对于 XCOFF64)。 |
C_STAT 符号的部分辅助条目
在 XCOFF32 中定义了节辅助符号表条目标识,以在符号表中提供有关编译器或汇编程序生成的节大小的信息。 编译器生成此信息是可选的,绑定程序将忽略并除去此信息。
| 偏移量 | 长度 (以字节计) | 名称和描述 |
|---|---|---|
| 0 | 4 |
|
| 4 | 2 |
|
| 6 | 2 |
|
| 8 | 10 |
|
字段定义
以下列表定义了字段:
| 项 | 描述 |
|---|---|
| x_scnlen | 指定节长度 (以字节计)。 |
| x_nreloc | 指定重定位项的数目。 此字段的最大值为 65535。 |
| x_nlinno | 指定行号数。 此字段的最大值为 65535。 |
| (无名称) | 已保留。 |
有关 XCOFF 文件格式的常规信息,请参阅 "XCOFF 对象文件格式" 。 有关符号表的更多信息,请参阅 "符号表信息" 。
有关调试的信息,请参阅 "调试部分" 。
C_DWARF 符号的 SECT 辅助条目
SECT 辅助符号表条目定义为在符号表中提供有关由 C_DWARF 符号表示的部分的大小的信息。
| 字段名称和描述 | XCOFF32 | XCOFF64 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
字段定义
以下列表定义了字段:
| 项 | 描述 |
|---|---|
| (no name) | 已预留 |
| x_scnlen | 此符号表示的部分部分的大小。 |
| x_nreloc | 此符号的重定位项数。 绑定程序将此字段设置为 0。 |
符号表字段内容 (按存储类)
此部分定义每个已定义的存储类的符号表字段内容 (n_sclass) 在 XCOFF 中使用。 下表按字母顺序列出了存储类条目。 请参阅 "符号表条目 (syms.h)" 以获取更多信息。
| 类定义 | 字段内容 |
|---|---|
| C_BCOMM 135 公共块的开头 |
|
| C_BINCL 108 包含文件的开头 |
|
| C_BLOCK 100 内部块的开始或结束 |
|
| C_BSTAT 143 静态块开始 |
|
| C_DECL 140 对象 (类型) 声明 |
|
| C_DWARF 112 DWARF 符号 |
|
| C_ECOML 136 公共块的本地成员 |
|
| C_ECOMM 137 公共块结束 |
|
| C_EINCL 109 包含文件结束 |
|
| C_ENTRY 141 备用条目 |
|
| C_ESTAT 144 静态块结束 |
|
| C_EXT 2 外部符号 (定义用于绑定程序处理的外部符号) |
|
| C_FCN 101 函数开始或结束 |
|
| C_FILE 103 源文件名称和编译器信息 |
|
| C_FUN 142 函数或过程 |
|
| C_GSYM 128 全局变量 |
|
| C_GTLS 145 全局线程局部变量 |
|
| C_HIDEXT 107 未命名的外部符号 |
|
| C_INFO 100 注释部分参考 |
|
| C_LSYM 129 在堆栈上分配的自动变量 |
|
| C_NULL 0 标记为待删除的符号表条目。 |
|
| c_PSYM 130 对堆栈上分配的子例程的自变量 |
|
| c_RPSYM 132 存储在寄存器中的函数或过程的自变量 |
|
| C_RSYM 131 寄存器变量 |
|
| C_STAT 3 静态符号 (未知。 某些编译器在符号表中生成这些符号以标识.text,.data和.bss部分。 未由绑定程序使用或保留。) |
|
| C_STSYM 133 静态分配符号 |
|
| C_STTLS 146 静态线程局部变量 |
|
| C_TCSYM 134 保留 |
|
| C_WEEXT 111 弱外部符号 (定义用于绑定程序处理的弱外部符号) |
|
- * 对于长名称,n_offset值是到.debug部分。
- ** 对于长名称,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_EXT 或 C_弱文本 符号。 该n_value字段未定义。 |
| C_FUN | 指定函数或过程。 可能具有相应的 C_EXT 或 C_弱文本 符号。 该n_value字段在包含的 csect 中是字节偏移量。 |
| C_GSYM | 指定全局变量,并具有相应的 C_EXT 或 C_弱文本 符号。 该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_EXT 或 C_弱文本 符号之后。 该n_value字段未定义。 |
| C_STTLS | 指定静态线程局部变量,并跟在具有相同名称的 C_HIDEXT 符号之后。 该n_value字段未定义。 |
有关 XCOFF 文件格式的常规信息,请参阅 "XCOFF 对象文件格式" 。 有关符号表的更多信息,请参阅 "符号表信息" 。
有关调试的信息,请参阅 "调试部分" 。
字符串表
在 XCOFF32中,字符串表包含长度超过 8 字节的符号的名称。 在 XCOFF64中,字符串表包含所有符号的名称。 如果存在字符串表,那么前 4 个字节包含字符串表的长度 (以字节计) ,包括此长度字段的长度。 表的其余部分是以 null 结束的 ASCII 字符串序列。 如果n_zeroes符号表条目中的字段为 0 ,那么n_offset字段将字节偏移量提供给符号名称的字符串表。
如果未使用字符串表,那么可以将其全部省略,或者可以使用仅由长度字段 (包含值 0 或 4) 组成的字符串表。 首选值 4。 下表显示了字符串表组织。
| 偏移量 | 长度 (以字节计) | 描述 |
|---|---|---|
| 0 | 4 | 字符串表的长度。 |
| 4 | n | 符号名称字符串,以 null 结束。 |
| 每个符号名称的字段重复。 |
有关 XCOFF 文件格式的常规信息,请参阅 "XCOFF 对象文件格式" 。
dbx 稳定弦
调试部分包含符号调试器 stabstrings (符号表字符串)。 它由编译器和汇编程序生成。 它提供符号属性信息以供符号调试器使用。
请参阅 "调试部分" 以获取常规讨论。
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 = 按值传递