这些数字在SPARC上的反汇编CALL指令中意味着什么?

时间:2018-08-17 08:47:15

标签: assembly solaris disassembly sparc dbx

在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_的偏移量)

这些不同是否正常?

1 个答案:

答案 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)不同,分支相对于分支指令的起始地址,而不是分支指令的结束/下一条指令的起始。

相关问题