0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎么快速把汇编代码和C语言代码对应起来呢?

冬至子 来源:Linux驿站 作者:szyhb1981 2023-06-12 16:45 次阅读

分析软件缺陷,有时候需要把ELF文件反汇编为汇编代码,然后分析汇编代码,需要把汇编代码和C语言代码对应起来。

如果一个函数比较长,那么人工把汇编代码和C语言代码对应起来,费时费力。怎么快速把汇编代码和C语言代码对应起来?

首先,编译程序的时候使用选项“-g”生成调试信息

gcc test.c -o test.elf -g

执行“readelf -S test.elf”,可以看到多个名称以“.debug_”开头的节,如下。

$ readelf -S test.elf
There are 35 section headers, starting at offset 0x1508:

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  ...
  [27] .debug_aranges    PROGBITS         0000000000000000  0000106b
       0000000000000030  0000000000000000           0     0     1
  [28] .debug_info       PROGBITS         0000000000000000  0000109b
       0000000000000173  0000000000000000           0     0     1
  [29] .debug_abbrev     PROGBITS         0000000000000000  0000120e
       0000000000000096  0000000000000000           0     0     1
  [30] .debug_line       PROGBITS         0000000000000000  000012a4
       0000000000000048  0000000000000000           0     0     1
  [31] .debug_str        PROGBITS         0000000000000000  000012ec
       00000000000000d2  0000000000000001  MS       0     0     1
  ...
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
  I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

使用objdump工具把ELF文件反汇编为汇编代码的时候,使用选项“-S”把源代码和汇编代码混合,并且输出到一个文本文件。

objdump -S test.elf > test_asm.txt

打开文本文件,下面是一个例子。

000000000040056a < func2 >:

void func2(int *ptr, int oldval, int newval)
{
  40056a: 55                    push   %rbp
  40056b: 48 89 e5              mov    %rsp,%rbp
  40056e: 48 83 ec 20           sub    $0x20,%rsp
  400572: 48 89 7d e8           mov    %rdi,-0x18(%rbp)
  400576: 89 75 e4              mov    %esi,-0x1c(%rbp)
  400579: 89 55 e0              mov    %edx,-0x20(%rbp)
    bool b;

    b = __atomic_compare_exchange_n(ptr, &oldval, newval,
  40057c: 8b 4d e0              mov    -0x20(%rbp),%ecx
  40057f: 48 8b 75 e8           mov    -0x18(%rbp),%rsi
  400583: 48 8d 55 e4           lea    -0x1c(%rbp),%rdx
  400587: 8b 02                 mov    (%rdx),%eax
  400589: f0 0f b1 0e           lock cmpxchg %ecx,(%rsi)
  40058d: 89 c1                 mov    %eax,%ecx
  40058f: 0f 94 c0              sete   %al
  400592: 84 c0                 test   %al,%al
  400594: 75 02                 jne    400598 < func2+0x2e >
  400596: 89 0a                 mov    %ecx,(%rdx)
  400598: 88 45 ff              mov    %al,-0x1(%rbp)
            false, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED);
    printf("b=%d\\n", b);
  40059b: 0f b6 45 ff           movzbl -0x1(%rbp),%eax
  40059f: 89 c6                 mov    %eax,%esi
  4005a1: bf 54 06 40 00        mov    $0x400654,%edi
  4005a6: b8 00 00 00 00        mov    $0x0,%eax
  4005ab: e8 60 fe ff ff        callq  400410 < printf@plt >
}
  4005b0: c9                    leaveq 
  4005b1: c3                    retq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7597

    浏览量

    136120
  • ELF文件
    +关注

    关注

    0

    文章

    14

    浏览量

    7128
收藏 人收藏

    评论

    相关推荐

    请问keil调试中如何通过黄色箭头指向的汇编语言找到对应C代码

    keil调试中如何通过黄色箭头指向的汇编语言找到对应位置的C代码
    发表于 12-25 09:06

    如何在底层编写汇编代码或者C语言代码

    在2000年前后,嵌入式软件工程师有着一套非常具体的技能,他们通常是电气工程师,不仅了解底层硬件的工作原理,还可以在底层编写汇编代码或者C语言代码
    发表于 12-15 06:28

    汇编代码大全

    由3926个源代码,包括8051/8096/8099/8048单片机汇编工具、汇编语言、摩托罗拉m68HC11、m680x0系列汇编语言、inter8051单片机
    发表于 04-04 23:54 211次下载

    报警产生器小程序 (C语言+汇编程序源代码)

    报警产生器小程序 (C语言+汇编程序源代码): 汇编代码:flag  &
    发表于 09-13 14:58 91次下载

    汇编语言代码分析

    汇编语言代码分析 查看源代码将发现它由4 4个文件组成,其中:• 两个是汇编语言文件,它们的名字带后缀“ . s”;• 28个是用“
    发表于 02-09 16:18 26次下载

    DSP编程技巧之链接汇编代码C_C++代码

    在DSP的开发中,常用的算法都可以用C/C++代码来高效实现。但是对一些特殊寄存器的读写,例如某些CPU寄存器的读写,因为C/C++
    发表于 10-18 09:47 7次下载
    DSP编程技巧之链接<b class='flag-5'>汇编</b><b class='flag-5'>代码</b>与<b class='flag-5'>C_C</b>++<b class='flag-5'>代码</b>

    单片机流水灯汇编语言代码大全(六款流水灯汇编语言代码

    本文主要介绍了六款流水灯汇编语言代码,具体的跟随小编一起来了解一下。
    发表于 04-26 14:37 5.5w次阅读

    单片机闪烁灯汇编语言代码大全(四款闪烁灯的汇编语言代码

    本文主要介绍了四款闪烁灯的汇编语言代码,具体的跟随小编一起来了解一下。
    发表于 04-26 14:47 2.5w次阅读

    C汇编代码结合 是实现DSP软件设计的最好方式

    众所周知,汇编语言具有更高的性能优势,而用C语言编码则能更容易和快速地实现。DSP处理器功能的不断增强以及编译器优化技术的提高,使得传统的用汇编语言
    发表于 01-31 17:11 2865次阅读
    <b class='flag-5'>C</b>和<b class='flag-5'>汇编</b><b class='flag-5'>代码</b>结合 是实现DSP软件设计的最好方式

    CPU如何执行代码 汇编语言教程

    的是低级语言,它专门用来控制硬件。汇编语言就是低级语言,直接描述/控制 CPU 的运行。如果你想了解 CPU 到底干了些什么,以及代码的运行步骤,就一定要学习
    的头像 发表于 08-25 11:14 3517次阅读
    CPU如何执行<b class='flag-5'>代码</b> <b class='flag-5'>汇编语言</b>教程

    C语言代码中调用汇编函数需要注意什么

    除了汇编语言工程和C语言工程,许多嵌入式工程既包含C语言又包含汇编语言。由于Keil MDK的默
    的头像 发表于 11-12 11:04 2791次阅读

    C语言如何写出高效代码

    当涉及复杂的高效C代码案例时,这些代码示例展示了C语言中一些复杂且高效的应用案例,涵盖了排序算法、图算法、位操作、文件操作、多线程编程等领域
    发表于 09-06 14:57 467次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>如何写出高效<b class='flag-5'>代码</b><b class='flag-5'>呢</b>?

    c语言怎么代码全部注释掉

    要将C语言代码全部注释掉,即不让代码被编译和执行,可以使用注释语句来实现。C语言提供两种注释方式
    的头像 发表于 11-22 10:21 6688次阅读

    hex文件如何查看原c语言代码

    是处理器可以直接执行的指令,而 C 语言代码则是人类可读的高级编程语言代码。 然而,如果你想要从 .hex 文件中获取一些有用的信息或者对程
    的头像 发表于 09-02 10:37 1459次阅读

    TMS320LF240x DSP的C语言汇编代码快速入门

    电子发烧友网站提供《TMS320LF240x DSP的C语言汇编代码快速入门.pdf》资料免费下载
    发表于 10-18 10:14 0次下载
    TMS320LF240x DSP的<b class='flag-5'>C</b><b class='flag-5'>语言</b>和<b class='flag-5'>汇编</b><b class='flag-5'>代码</b><b class='flag-5'>快速</b>入门