【问题标题】:What do the numbers mean in a disassembled CALL instruction on SPARC?SPARC 上反汇编的 CALL 指令中的数字是什么意思?
【发布时间】:2019-01-24 06:33:49
【问题描述】:

在 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 数字是什么意思?

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

这些不同是否正常?

【问题讨论】:

    标签: assembly solaris disassembly sparc dbx


    【解决方案1】:

    我不知道这两种工具,但我可以回答其中的一部分,因为它们看起来类似于 gdb 和其他典型反汇编程序显示的内容:

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


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

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

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

    来自the SPARCv8 ISA manual的一些引用:

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

    PC 相关 CTI 通过符号扩展其立即数来计算其目标地址 字段为 32 位,将该字位移左移两位以创建 字节位移,并将生成的字节位移添加到内容中 个人电脑。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多