为什么一个只调用 printf 的函数,对应的汇编代码这么复杂?

查看 19|回复 1
作者:amiwrong123   
#include
void print_banner()
{
    printf("Welcome to World of PLT and GOT\n");
}
int main(void)
{
    print_banner();
    return 0;
}
如上,有一个 test.c ,使用 gcc -Wall -g -o test.o -c test.c -m32 编译后(最开始报错了,然后通过 sudo apt-get install libc6-dev:i386 解决),得到了 test.o 文件。
然后通过 objdump -d test.o 查看汇编,却发现print_banner函数的汇编很奇怪,是这样的:
test.o:     file format elf32-i386
Disassembly of section .text:
00000000 :
   0:   f3 0f 1e fb             endbr32
   4:   55                      push   %ebp
   5:   89 e5                   mov    %esp,%ebp
   7:   53                      push   %ebx
   8:   83 ec 04                sub    $0x4,%esp
   b:   e8 fc ff ff ff          call   c
  10:   05 01 00 00 00          add    $0x1,%eax
  15:   83 ec 0c                sub    $0xc,%esp
  18:   8d 90 00 00 00 00       lea    0x0(%eax),%edx
  1e:   52                      push   %edx
  1f:   89 c3                   mov    %eax,%ebx
  21:   e8 fc ff ff ff          call   22
  26:   83 c4 10                add    $0x10,%esp
  29:   90                      nop
  2a:   8b 5d fc                mov    -0x4(%ebp),%ebx
  2d:   c9                      leave
  2e:   c3                      ret
感觉 call 22 之前做的很多事情都不理解。比如为什么上面还有一次 call c ?
实际上我看别人生成的汇编都是这样的( https://blog.csdn.net/linyt/article/details/51635768 ):
00000000 :
      0:  55                   push %ebp
      1:  89 e5                mov %esp, %ebp
      3:  83 ec 08             sub   $0x8, %esp
      6:  c7 04 24 00 00 00 00 movl  $0x0, (%esp)
      d:  e8 fc ff ff ff       call  e
     12:  c9                   leave
     13:  c3                   ret
问一下各位大佬,为什么我的print_banner函数的汇编这么奇怪啊?
另外,用gcc -S -o test.s test.c -m32生成了 test.s 这种方式来看汇编,发现是这样的,第一次的 call 是调用的__x86.get_pc_thunk.ax:
print_banner:
.LFB0:
        .cfi_startproc
        endbr32
        pushl   %ebp
        .cfi_def_cfa_offset 8
        .cfi_offset 5, -8
        movl    %esp, %ebp
        .cfi_def_cfa_register 5
        pushl   %ebx
        subl    $4, %esp
        .cfi_offset 3, -12
        call    __x86.get_pc_thunk.ax
        addl    $_GLOBAL_OFFSET_TABLE_, %eax
        subl    $12, %esp
        leal    .LC0@GOTOFF(%eax), %edx
        pushl   %edx
        movl    %eax, %ebx
        call    puts@PLT
        addl    $16, %esp
        nop
        movl    -4(%ebp), %ebx
        leave
        .cfi_restore 5
        .cfi_restore 3
        .cfi_def_cfa 4, 4
        ret
        .cfi_endproc
swulling   
这种问题,问大模型(比如 GPT-4 )是最合适的。搜索很难直接找到答案,但是也不算难。
我问了下,回答的还不错。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部