.fnstart,.fnend等伪操作对assembler的影响?

来源:互联网 发布:淘宝alexa 编辑:程序博客网 时间:2024/06/06 13:59

在汇编语言程序源码中添加.fnstart,.fnend等伪操作,会对汇编器有什么影响呢?

参考上一篇的 编译C/C++语言程序源码生成的汇编语言程序源码中的.fnstart,.fnend等伪操作 文章,依然使用相同的C语言程序源码,将上一篇中生成的两组汇编语言程序源码分别进行汇编,然后再进行反汇编,查看反汇编的汇编代码的差别:

1、汇编arm-c-no-unwind.s:

arm-linux-androideabi-as -o arm-c-no-unwind.o arm-c-no-unwind.s


2、汇编arm-c-unwind.s:

arm-linux-androideabi-as -o arm-c-unwind.o arm-c-unwind.s


3、使用arm-linux-androideabi-objdump工具,对汇编生成的目标文件进行反汇编;


4、反汇编arm-c-no-unwind.o:

arm-linux-androideabi-objdump -D arm-c-no-unwind.o > no-unwind

查看反汇编生成的代码:

arm-c-no-unwind.o:     file format elf32-littlearm

Disassembly of section .text:

00000000 <sum>:
   0:   e52db004        push    {fp}            ; (str fp, [sp, #-4]!)
   4:   e28db000        add     fp, sp, #0
   8:   e24dd00c        sub     sp, sp, #12
   c:   e50b0008        str     r0, [fp, #-8]
  10:   e50b100c        str     r1, [fp, #-12]
  14:   e51b2008        ldr     r2, [fp, #-8]
  18:   e51b300c        ldr     r3, [fp, #-12]
  1c:   e0823003        add     r3, r2, r3
  20:   e1a00003        mov     r0, r3
  24:   e24bd000        sub     sp, fp, #0
  28:   e49db004        pop     {fp}            ; (ldr fp, [sp], #4)
  2c:   e12fff1e        bx      lr

00000030 <sub>:
  30:   e52db004        push    {fp}            ; (str fp, [sp, #-4]!)
  34:   e28db000        add     fp, sp, #0
  38:   e24dd00c        sub     sp, sp, #12
  3c:   e50b0008        str     r0, [fp, #-8]
  40:   e50b100c        str     r1, [fp, #-12]
  44:   e51b2008        ldr     r2, [fp, #-8]
  48:   e51b300c        ldr     r3, [fp, #-12]
  4c:   e0633002        rsb     r3, r3, r2
  50:   e1a00003        mov     r0, r3

  54:   e24bd000        sub     sp, fp, #0
  58:   e49db004        pop     {fp}            ; (ldr fp, [sp], #4)
  5c:   e12fff1e        bx      lr

Disassembly of section .comment:

00000000 <.comment>:
   0:   43434700        movtmi  r4, #14080      ; 0x3700
   4:   4728203a                        ; <UNDEFINED> instruction: 0x4728203a
   8:   2029554e        eorcs   r5, r9, lr, asr #10
   c:   00382e34        eorseq  r2, r8, r4, lsr lr

Disassembly of section .ARM.attributes:

00000000 <.ARM.attributes>:
   0:   00003e41        andeq   r3, r0, r1, asr #28
   4:   61656100        cmnvs   r5, r0, lsl #2
   8:   01006962        tsteq   r0, r2, ror #18
   c:   00000034        andeq   r0, r0, r4, lsr r0
  10:   726f4305        rsbvc   r4, pc, #335544320      ; 0x14000000
  14:   2d786574        cfldr64cs       mvdx6, [r8, #-464]!     ; 0xfffffe30
  18:   06003941        streq   r3, [r0], -r1, asr #18
  1c:   0841070a        stmdaeq r1, {r1, r3, r8, r9, sl}^
  20:   0a020901        beq     8242c <sub+0x823fc>
  24:   12010c03        andne   r0, r1, #768    ; 0x300
  28:   15011404        strne   r1, [r1, #-1028]        ; 0x404
  2c:   18031701        stmdane r3, {r0, r8, r9, sl, ip}

  30:   1a011901        bne     4643c <sub+0x4640c>
  34:   1e031b02        vmlane.f64      d1, d3, d2
  38:   2a012206        bcs     48858 <sub+0x48828>
  3c:   Address 0x000000000000003c is out of bounds.


4、反汇编arm-c-unwind.o:

arm-linux-androideabi-objdump -D arm-c-unwind.o > unwind

查看反汇编生成的代码:

arm-c-unwind.o:     file format elf32-littlearm

Disassembly of section .text:

00000000 <sum>:
   0:   e52db004        push    {fp}            ; (str fp, [sp, #-4]!)
   4:   e28db000        add     fp, sp, #0
   8:   e24dd00c        sub     sp, sp, #12
   c:   e50b0008        str     r0, [fp, #-8]
  10:   e50b100c        str     r1, [fp, #-12]
  14:   e51b2008        ldr     r2, [fp, #-8]
  18:   e51b300c        ldr     r3, [fp, #-12]
  1c:   e0823003        add     r3, r2, r3
  20:   e1a00003        mov     r0, r3
  24:   e24bd000        sub     sp, fp, #0
  28:   e49db004        pop     {fp}            ; (ldr fp, [sp], #4)
  2c:   e12fff1e        bx      lr

00000030 <sub>:
  30:   e52db004        push    {fp}            ; (str fp, [sp, #-4]!)
  34:   e28db000        add     fp, sp, #0
  38:   e24dd00c        sub     sp, sp, #12
  3c:   e50b0008        str     r0, [fp, #-8]
  40:   e50b100c        str     r1, [fp, #-12]
  44:   e51b2008        ldr     r2, [fp, #-8]
  48:   e51b300c        ldr     r3, [fp, #-12]
  4c:   e0633002        rsb     r3, r3, r2
  50:   e1a00003        mov     r0, r3

  54:   e24bd000        sub     sp, fp, #0
  58:   e49db004        pop     {fp}            ; (ldr fp, [sp], #4)
  5c:   e12fff1e        bx      lr

Disassembly of section .ARM.exidx:

00000000 <.ARM.exidx>:
   0:   00000000        andeq   r0, r0, r0
   4:   00000001        andeq   r0, r0, r1
   8:   00000030        andeq   r0, r0, r0, lsr r0
   c:   00000001        andeq   r0, r0, r1


Disassembly of section .comment:

00000000 <.comment>:
   0:   43434700        movtmi  r4, #14080      ; 0x3700
   4:   4728203a                        ; <UNDEFINED> instruction: 0x4728203a
   8:   2029554e        eorcs   r5, r9, lr, asr #10
   c:   00382e34        eorseq  r2, r8, r4, lsr lr

Disassembly of section .ARM.attributes:

00000000 <.ARM.attributes>:
   0:   00003e41        andeq   r3, r0, r1, asr #28
   4:   61656100        cmnvs   r5, r0, lsl #2
   8:   01006962        tsteq   r0, r2, ror #18
   c:   00000034        andeq   r0, r0, r4, lsr r0

  10:   726f4305        rsbvc   r4, pc, #335544320      ; 0x14000000
  14:   2d786574        cfldr64cs       mvdx6, [r8, #-464]!     ; 0xfffffe30
  18:   06003941        streq   r3, [r0], -r1, asr #18
  1c:   0841070a        stmdaeq r1, {r1, r3, r8, r9, sl}^
  20:   0a020901        beq     8242c <sub+0x823fc>
  24:   12010c03        andne   r0, r1, #768    ; 0x300
  28:   15011404        strne   r1, [r1, #-1028]        ; 0x404
  2c:   18031701        stmdane r3, {r0, r8, r9, sl, ip}
  30:   1a011901        bne     4643c <sub+0x4640c>
  34:   1e031b02        vmlane.f64      d1, d3, d2
  38:   2a012206        bcs     48858 <sub+0x48828>
  3c:   Address 0x000000000000003c is out of bounds.


通过对比,我们发现unwind.o的反汇编代码比no-unwind.o的反汇编代码多出一个section:

Disassembly of section .ARM.exidx:

00000000 <.ARM.exidx>:
   0:   00000000        andeq   r0, r0, r0
   4:   00000001        andeq   r0, r0, r1
   8:   00000030        andeq   r0, r0, r0, lsr r0
   c:   00000001        andeq   r0, r0, r1


那么,这个section中的内容的作用是什么呢?

参考ARM文档”ELF for the ARM Architecture“,章节4.4.4,Special Sections,列出了部分ARM special sections,其中有一个就是”.ARM.exidx*“,其类型是SHT_ARM_EXIDX,表示Exception Index table,marks a section containing index information for exception unwinding。Names beginning .ARM.exidx names sections containing index entries for section unwinding.

关于”.ARM.exidx*“中的内容,需要参考文档”Exception Handling ABI for the ARM Architecture“,章节5, INDEX TABLE ENTRIES,

An index table entry consists of 2 words,因此,上面所列的.ARM.exidx section中包含两个index table entries:





原创粉丝点击