RISC-V反汇编程序与尖峰运行结果不匹配?

时间:2017-01-24 00:06:18

标签: gcc assembly compilation riscv disassembly

我已经设置了一个hello world程序,仅用于测试我的riscv32-unknown-elf工具链,spikepk等等。虽然我设法使用{{打印'hello world 1}},我发现如果我添加spike --isa=RV32 pk hello.elf标志进行调试,我会得到以下说明(整体的一部分):

-d

无论如何,它与core 0: 0x0000000000001000 (0x7ffff297) auipc t0, 0x7ffff : core 0: 0x0000000000001004 (0x00028067) jr t0 : core 0: 0xffffffff80000000 (0x1b00006f) j pc + 0x1b0 : core 0: 0xffffffff800001b0 (0x00000093) li ra, 0 : core 0: 0xffffffff800001b4 (0x00000113) li sp, 0 : core 0: 0xffffffff800001b8 (0x00000193) li gp, 0 : core 0: 0xffffffff800001bc (0x00000213) li tp, 0 : core 0: 0xffffffff800001c0 (0x00000293) li t0, 0 : core 0: 0xffffffff800001c4 (0x00000313) li t1, 0 : core 0: 0xffffffff800001c8 (0x00000393) li t2, 0 : core 0: 0xffffffff800001cc (0x00000413) li s0, 0 : core 0: 0xffffffff800001d0 (0x00000493) li s1, 0 : core 0: 0xffffffff800001d4 (0x00000513) li a0, 0 : core 0: 0xffffffff800001d8 (0x00000593) li a1, 0 : core 0: 0xffffffff800001dc (0x00000613) li a2, 0 : core 0: 0xffffffff800001e0 (0x00000693) li a3, 0 : core 0: 0xffffffff800001e4 (0x00000713) li a4, 0 : core 0: 0xffffffff800001e8 (0x00000793) li a5, 0 : core 0: 0xffffffff800001ec (0x00000813) li a6, 0 : core 0: 0xffffffff800001f0 (0x00000893) li a7, 0 : core 0: 0xffffffff800001f4 (0x00000913) li s2, 0 : core 0: 0xffffffff800001f8 (0x00000993) li s3, 0 : core 0: 0xffffffff800001fc (0x00000a13) li s4, 0 : core 0: 0xffffffff80000200 (0x00000a93) li s5, 0 : core 0: 0xffffffff80000204 (0x00000b13) li s6, 0 : core 0: 0xffffffff80000208 (0x00000b93) li s7, 0 : core 0: 0xffffffff8000020c (0x00000c13) li s8, 0 : core 0: 0xffffffff80000210 (0x00000c93) li s9, 0 : core 0: 0xffffffff80000214 (0x00000d13) li s10, 0 : core 0: 0xffffffff80000218 (0x00000d93) li s11, 0 : core 0: 0xffffffff8000021c (0x00000e13) li t3, 0 : core 0: 0xffffffff80000220 (0x00000e93) li t4, 0 : core 0: 0xffffffff80000224 (0x00000f13) li t5, 0 : core 0: 0xffffffff80000228 (0x00000f93) li t6, 0 : core 0: 0xffffffff8000022c (0x34001073) csrw mscratch, zero : core 0: 0xffffffff80000230 (0x00000297) auipc t0, 0x0 : core 0: 0xffffffff80000234 (0xdd828293) addi t0, t0, -552 : core 0: 0xffffffff80000238 (0x30529073) csrw mtvec, t0 : core 0: 0xffffffff8000023c (0x30502373) csrr t1, mtvec : core 0: 0xffffffff80000240 (0x00629063) bne t0, t1, pc + 0 : core 0: 0xffffffff80000244 (0x00012117) auipc sp, 0x12 (也是开头部分)产生的反汇编程序不匹配:

riscv32-unknown-elf-objdump -d hello.elf > hello.dump

我很困惑,因为地址和机器代码之间存在很大差异。如果你能给我一些想法,我真的很感激。谢谢!

祝你好运, CY

2 个答案:

答案 0 :(得分:1)

如果您这样启动Spike

spike -d --isa=RV32 pk hello.elf

您的交互式调试会话从代理内核(pk)的第一条指令开始,而不是在用户空间程序的第一条指令中开始。

通常要做的是继续执行pk,然后中断程序的第一条指令(例如,请参见objdump输出中的起始地址),例如

: until pc 0 10074

,然后从此处进行单步操作( ENTER )。

另请参阅Spike帮助命令(h)。

答案 1 :(得分:0)

我认为在spike中你会看到启动过程的开始和pk二进制文件(在物理地址中)。在objdump输出中,您从入口点反汇编了ELF。所以你好二进制文件可能会在spike输出中的某个地方......

你从尖峰看到的东西类似于我的机器初始代码:https://github.com/riscv/riscv-pk/blob/6c1d0604dcabf36a6a8d8d9a839b2d4634e202d2/machine/mentry.S#L183

core   0: 0x0000000000001000 (0x7ffff297) auipc   t0, 0x7ffff
:  
core   0: 0x0000000000001004 (0x00028067) jr      t0

reset_vector:
  j do_reset
在加载并运行用户应用do_reset之前,

然后是machine/mentry.S的精确pk(第183行),它仍然位于主hello代码之前:

do_reset:
  li x1, 0
  li x2, 0
  li x3, 0
  li x4, 0
  li x5, 0
  li x6, 0
  li x7, 0
  li x8, 0
  li x9, 0
  li x10, 0
  li x11, 0
  li x12, 0
  li x13, 0
  li x14, 0
  li x15, 0
  li x16, 0
  li x17, 0
  li x18, 0
  li x19, 0
  li x20, 0
  li x21, 0
  li x22, 0
  li x23, 0
  li x24, 0
  li x25, 0
  li x26, 0
  li x27, 0
  li x28, 0
  li x29, 0
  li x30, 0
  li x31, 0
  csrw mscratch, x0

  # write mtvec and make sure it sticks
  la t0, trap_vector
  csrw mtvec, t0
  csrr t1, mtvec
1:bne t0, t1, 1b