0

在 SPARC Solaris 下使用mdbdbx调试器分析核心转储。

mdb dis DCMD 显示:

>fn_name+0x1cc::dis
lib.so`fn_name+0x1cc: call      +0xa92fc      <0xfafbc36c>

相同地址的dbx dis命令和核心文件显示:

(dbx) dis fn_name+0x1cc
0xfaf1307c: fn_name+0x01cc:       call     _PROCEDURE_LINKAGE_TABLE_+0x15c0 [PLT] ! 0xfafbc350

(dbx) print _PROCEDURE_LINKAGE_TABLE_
_PROCEDURE_LINKAGE_TABLE_ = 0

mdb 中的 +0xa92fc <0xfafbc36c> 数字是什么意思?

dbx下的0xfafbc350是什么?(我猜 0x15c0 是从 _PROCEDURE_LINKAGE_TABLE_ 的偏移量)

这些不同是正常的吗?

4

1 回答 1

2

我不知道这些工具中的任何一个,但我可以回答其中的一部分,因为它们看起来与gdb其他典型的反汇编程序显示的相似:

0xfafbc36c是绝对目的地;反汇编程序方便地为您计算分支目标。


+0xa92fc是机器指令中的相对偏移量。与几乎所有架构一样,SPARC 分支和call指令使用相对位移。

这是一个左移 2 的 30 位位移,因此它可以到达任何其他字对齐地址,但它仍然是相对的,因此与位置无关的代码可以轻松工作。如果在不同的地址加载相同的代码,+0x0xa92fc偏移量将相同,但绝对目标将不同。

常规分支仅使用 22 位或更小的位移,再次左移 2。

SPARCv8 ISA 手册中的一些引用:

PC 相关 CTI (控制转移指令)

PC 相关 CTI 通过将其立即域符号扩展为 32 位、将该字位移左移两位以创建字节位移并将结果字节位移添加到 PC 的内容来计算其目标地址。

32 位PC包含 IU 当前正在执行的指令的地址。

所以与其他一些架构(例如x86)不同,分支是相对于分支指令的起始地址,而不是分支指令的结束/下一条指令的开始。

于 2018-08-17T09:52:38.137 回答