在反汇编程序上识别的奇怪指令产生了汇编代码

时间:2014-09-22 05:13:06

标签: c gcc assembly disassembly objdump

测试在x86 32位Linux,Ubuntu 12.04,GCC 4.6.3 objdump 2.22

基本上当我使用gcc生成函数 foo 的汇编代码时,这样:

gcc -S foo.c -O2
as --listing-lhs-width=4 -alcdn foo.s

在函数 foo 的末尾,我可以获得这样的一系列指令(我修改了它并附上了每条指令及其机器代码以使其清楚):

             ......
1977                                                 .cfi_restore_state
1978  8B150000 0000                                  movl    nodes, %edx
1979  89442410                                       movl    %eax, 16(%esp)
1980  A1000000 00                                    movl    i_depth, %eax
1981  8974240C                                       movl    %esi, 12(%esp)
1982  C7442404 FC000000                              movl    $.LC55, 4(%esp)
1983  89542414                                       movl    %edx, 20(%esp)
1984  89442408                                       movl    %eax, 8(%esp)
1985  C7042401 000000                                movl    $1, (%esp)
1986  E8FCFFFF FF                                    call    __printf_chk
1987  E937FFFF FF                                    jmp     .L181
1988                                         .L186:
1989  E8FCFFFF FF                                    call    __stack_chk_fail

foo1:

看起来很正常。

然而,当我编译+链接以创建ELF可执行文件,然后用objdump反汇编它:

gcc foo.c -O2
objdump -Dr -j .text foo

反汇编程序生成的指令看起来像这样(我修改了一下以便更容易理解):

11856 89442410                                mov %eax,0x10(%esp)
11857 A1000000 00                             mov 0x80851AC,%eax
11858 8974240C                                mov %esi,0xC(%esp)
11859 C7442404 00000000                       movl $S_0x8064658,0x4(%esp)
11860 89542414                                mov %edx,0x14(%esp)
11861 89442408                                mov %eax,0x8(%esp)
11862 C7042401 000000                         movl $0x1,(%esp)
11863 E8FCFFFF FF                             call __printf_chk
11864 E933FFFF FF                             jmp 0x80547EB
11865
11866 E8FCFFFF FF                             S_0x80548BC : call __stack_chk_fail
11867 EB0D                                    jmp foo1
11868 90                                      nop
11869 90                                      nop
11870 90                                      nop
11871 90                                      nop
11872 90                                      nop
11873 90                                      nop
11874 90                                      nop
11875 90                                      nop
11876 90                                      nop
11877 90                                      nop
11878 90                                      nop
11879 90                                      nop
11880 90                                      nop
11881                                         foo1:

查看函数foo的结尾,我找到了原始汇编代码中找不到的一系列指令。

这似乎是一个填充问题,但我不确定。

所以我的问题是:

  1. 这些指令序列是什么?
  2. 有没有告诉汇编程序(或链接器?)'不生成这些指令序列'?因为基本上我正在使用汇编代码分析工具,这些指令序列对于编码非常烦人。

0 个答案:

没有答案