Solaris 模块调试器指南

符号名称解析

语法中所述,表达式上下文中存在的符号标识符的计算结果是此符号的值。该值通常表示与目标虚拟地址空间中符号关联的存储区的虚拟地址。目标可以支持多个符号表,包括但不限于:

目标通常先搜索主可执行文件的符号表,然后搜索一个或多个其他符号表。请注意,ELF 符号表仅包含外部、全局和静态符号的项;自动符号不出现在 MDB 处理的符号表中。

此外,MDB 提供了专用的用户定义符号表,在搜索任何目标符号表之前都会先搜索该表。专用符号表最初为空,可以使用 ::nmadd::nmdel dcmd 处理它。

可以使用 ::nm -P 选项显示专用符号表的内容。通过专用符号表,用户可以为程序函数或者原始程序中缺少的或已删除的数据创建符号定义。然后,每当 MDB 将符号名称转换为地址,或将地址转换为最接近的符号时,都可以使用这些定义。

由于目标包含多个符号表,而且每个符号表可以包括多个目标文件中的符号,因此可能存在同名的不同符号。MDB 将反引号 “`“ 字符用作符号名称作用域运算符,以允许程序员在这种情况下获取所需符号的值。

可以指定用于将符号名称解析为以下任一内容的作用域:object`namefile`nameobject`file`name。对象标识符引用装入对象的名称。文件标识符引用源文件的基本名称,该文件在指定对象的符号表中具有 STT_FILE 类型的符号。如何解释对象标识符取决于目标类型。

MDB 内核目标要求 object 指定已装入内核模块的基本名称。例如,符号名称:

specfs`_init

的计算结果是 specfs 内核模块中 _init 符号的值。

mdb 进程目标要求 object 指定可执行文件或已装入共享库的名称。它可以采用以下任一形式:

进程目标还可接受上述四种形式前面加上可选的链接映射 id (lmid)。 lmid 前缀由初始 LM 后跟十六进制链接映射 id 以及附加反引号指定。 例如,符号名称:

LM0`libc.so.1`_init

的计算结果将是在链接映射 0 (LM_ID_BASE) 上装入的 libc.so.1 库中 _init 符号的值。 如果在多个链接映射上装入同一库,则解决符号命名冲突可能需要链接映射说明符。 有关链接映射的更多信息,请参阅《链接程序和库指南》和 dlopen(3C) 手册页。根据 showlmid 选项的设置列显符号时将显示链接映射标识符,如命令行选项摘要中所述。

如果符号和十六进制整数值之间存在命名冲突,则 MDB 尝试首先将不明确的标记计算为符号,然后将它计算为整数值。例如,标记 f 可以指以十六进制(缺省基数)指定的十进制整数值 15,也可以指目标符号表中名为 f 的全局变量。如果存在名称不明确的符号,则可以使用显式 0x0X 前缀指定整数值。