在SPARC Solaris下使用 mdb 和 dbx 调试器分析核心转储。
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_的偏移量)
这些不同是否正常?
答案 0 :(得分:2)
我不知道这些工具中的任何一个,但是我可以回答其中的一部分,因为它们看起来类似于gdb
和其他典型反汇编程序显示的内容:
0xfafbc36c
是绝对目的地;反汇编程序可以方便地为您计算分支目标。
+0xa92fc
是机器指令中的相对偏移量。与几乎所有架构一样,SPARC分支和call
指令使用相对位移。
这是一个30位左移2的位移,因此它可以到达任何其他字对齐的地址,但是它仍然是相对的,因此位置无关的代码可以轻松地工作。如果将相同的代码加载到不同的地址,则+0x0xa92fc
偏移量将相同,但绝对目标将不同。
常规分支仅使用22位或更小的位移,再次左移2位。
the SPARCv8 ISA manual中的一些引号:
与PC相关的CTI (控制传输指令)
相对PC的CTI通过符号扩展其立即数来计算其目标地址 字段为32位,将单词位移左移两位以创建 一个字节位移,并将结果字节位移加到内容中 PC的。
32位的
PC
包含IU当前正在执行的指令的地址。
因此,与某些其他体系结构(例如x86)不同,分支相对于分支指令的起始地址,而不是分支指令的结束/下一条指令的起始。