liaozhicai 2024-06-13 18:08 采纳率: 20%
浏览 2

ld函数出现sigill怎么查

抓到了sigill信号:
[18:26:086]sno:4 Fault address:0 s-code:128 eno:0
[18:26:303]/lib/libc.so.6(+0x34b1a160) [0x77442160]
[18:26:304]linux-vdso.so.1(+0x920) [0x7ff97920]
[18:26:304]/usr/bin/MecMgr(__libc_csu_init+0xa2) [0x556bd002]
mips32架构,指令都是固定4字节长度,怎么跑到0xa2(162)去了?会有哪些原因?


```c

0007ef60 <__libc_csu_init@@Base>:
   7ef60:       3c1c0003        lui     gp,0x3
   7ef64:       279ca120        addiu   gp,gp,-24288
   7ef68:       0399e021        addu    gp,gp,t9
   7ef6c:       27bdffc8        addiu   sp,sp,-56
   7ef70:       afbf0034        sw      ra,52(sp)
   7ef74:       afb50030        sw      s5,48(sp)
   7ef78:       afb4002c        sw      s4,44(sp)
   7ef7c:       afb30028        sw      s3,40(sp)
   7ef80:       afb20024        sw      s2,36(sp)
   7ef84:       afb10020        sw      s1,32(sp)
   7ef88:       afb0001c        sw      s0,28(sp)
   7ef8c:       00809825        move    s3,a0
   7ef90:       8f998c1c        lw      t9,-29668(gp)
   7ef94:       00a0a025        move    s4,a1
   7ef98:       afbc0010        sw      gp,16(sp)
   7ef9c:       0320f809        jalr    t9
   7efa0:       00c0a825        move    s5,a2
   7efa4:       8fbc0010        lw      gp,16(sp)
   7efa8:       8f908c20        lw      s0,-29664(gp)
   7efac:       8f928c24        lw      s2,-29660(gp)
   7efb0:       02509023        subu    s2,s2,s0
   7efb4:       00129083        sra     s2,s2,0x2
   7efb8:       1240000a        beqz    s2,7efe4 <__libc_csu_init@@Base+0x84>
   7efbc:       00008825        move    s1,zero
   7efc0:       8e190000        lw      t9,0(s0)
   7efc4:       02a03025        move    a2,s5
   7efc8:       02802825        move    a1,s4
   7efcc:       26310001        addiu   s1,s1,1
   7efd0:       02602025        move    a0,s3
   7efd4:       0320f809        jalr    t9
   7efd8:       26100004        addiu   s0,s0,4
   7efdc:       1651fff8        bne     s2,s1,7efc0 <__libc_csu_init@@Base+0x60>
   7efe0:       00000000        nop
   7efe4:       8fbf0034        lw      ra,52(sp)
   7efe8:       8fb50030        lw      s5,48(sp)
   7efec:       8fb4002c        lw      s4,44(sp)
   7eff0:       8fb30028        lw      s3,40(sp)
   7eff4:       8fb20024        lw      s2,36(sp)
   7eff8:       8fb10020        lw      s1,32(sp)
   7effc:       8fb0001c        lw      s0,28(sp)
   7f000:       03e00008        jr      ra
   7f004:       27bd0038        addiu   sp,sp,56

```

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-06-13 18:08
    关注

    引自免费微信小程序:皆我百晓生

    遇到SIGILL信号通常意味着程序执行了非法指令。在MIPS32架构下,由于所有指令都是4字节对齐且固定长度,这通常指向一个内存访问错误或者是执行了一个无效的指令码。从你提供的信息来看,问题发生在__libc_csu_init函数的地址0xa2处。

    解析SIGILL原因:

    1. 非法指令码:可能是由于内存中的数据被误读为指令执行。
    2. 缓存一致性问题:如果系统使用了缓存,可能有缓存一致性错误导致读取到错误的指令码。
    3. 硬件故障:虽然不太常见,但硬件层面的问题也可能导致此类错误。
    4. 编译器优化错误:虽然罕见,但有时编译器可能生成了不正确的代码。
    5. 加载错误:动态链接库加载时可能出现错误,导致指令地址不正确。

    调查步骤:

    1. 检查二进制文件

    确保二进制文件没有被破坏或篡改。可以尝试重新编译和链接应用程序。

    2. 分析反汇编代码

    你已经提供了__libc_csu_init的部分反汇编代码,但未看到0xa2位置的指令。你需要查看该位置的指令码,确定其是否合法。

    3. 使用GDB调试

    启动GDB并设置断点在__libc_csu_init函数的开始,然后单步执行直到0xa2位置。观察在此过程中是否有异常的内存访问或指令读取。

    gdb /usr/bin/MecMgr
    break __libc_csu_init
    run
    

    在GDB中,使用disassemble命令查看__libc_csu_init的详细指令流。

    4. 检查内存布局

    确认__libc_csu_init函数的地址是否正确加载到内存中。使用info proc mappings命令检查进程的内存映射。

    5. 审查编译器选项

    检查编译和链接时使用的选项,确保没有启用可能导致问题的优化。

    6. 硬件诊断

    虽然可能性较低,但进行硬件诊断以排除潜在的硬件故障也是一个好主意。

    模拟图示:

    为了更直观地理解SIGILL可能的原因,可以想象如下场景:

    +---------------------+         +---------------------+
    |                     |         |                     |
    |  正确的指令流       |         |  错误的指令流       |
    |                     |         |                     |
    |  0x00               |         |  0x00               |
    |  0x04               |         |  0x04               |
    |  ...                |         |  ...                |
    |  0xa0               |         |  0xa0               |
    |  0xa4               |         |  0xa4               | <--- 正常指令
    |                     |         |                     |
    |  0xa8               |         |  0xa8               |
    |                     |         |                     |
    |  0xac               |         |  0xac               |
    |                     |         |                     |
    |  0xb0               |         |  0xb0               |
    |                     |         |                     |
    |  ...                |         |  ...                |
    +---------------------+         +---------------------+
                            |
                            |
                            v
                    +---------------------+
                    |                     |
                    |  非法指令或数据    |
                    |                     |
                    |  0xa2 (162)         |
                    |                     |
                    +---------------------+
    

    在这个模拟图中,左边是正常的指令流,而右边是包含错误(可能是数据而非指令)的指令流。SIGILL0xa2位置发生,意味着在该位置遇到了非法指令。

    通过上述步骤,你应该能够定位问题所在,并采取相应的解决措施。如果问题依然存在,可能需要更深入的技术支持或专业的硬件检查。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月13日