美文网首页
函数调用为何会发生栈溢出(第7讲)

函数调用为何会发生栈溢出(第7讲)

作者: 牛牛_735d | 来源:发表于2019-08-06 11:12 被阅读0次

    一、为什么需要程序栈
    示例代码:

    // function_Example.c
    #include <stdio.h>
    int static add(int a, int b) 
    {
        return a+b;
    }
    
    int main()
    {
       int x = 5;
       int y = 10;
       int u = add(x, y);
    }
    

    编译代码、使用objdump打印出来

    int static add(int a, int b)
    {
       0:   55                      push   rbp   # bp是基址指针寄存器、处理函数调用、 push rbp 就是先将rbp的内存保存入栈
       1:   48 89 e5                mov    rbp,rsp #将rsp的值赋给rbp(rbp始终执行栈帧底部、rsp始终指向栈帧顶部)
       4:   89 7d fc                mov    DWORD PTR [rbp-0x4],edi
       7:   89 75 f8                mov    DWORD PTR [rbp-0x8],esi
        return a+b;
       a:   8b 55 fc                mov    edx,DWORD PTR [rbp-0x4]
       d:   8b 45 f8                mov    eax,DWORD PTR [rbp-0x8]
      10:   01 d0                   add    eax,edx
    }
      12:   5d                      pop    rbp
      13:   c3                      ret    
    0000000000000014 <main>:
    int main()
    {
      14:   55                      push   rbp
      15:   48 89 e5                mov    rbp,rsp
      18:   48 83 ec 10             sub    rsp,0x10
        int x = 5;
      1c:   c7 45 fc 05 00 00 00    mov    DWORD PTR [rbp-0x4],0x5
        int y = 10;
      23:   c7 45 f8 0a 00 00 00    mov    DWORD PTR [rbp-0x8],0xa
        int u = add(x, y);
      2a:   8b 55 f8                mov    edx,DWORD PTR [rbp-0x8]
      2d:   8b 45 fc                mov    eax,DWORD PTR [rbp-0x4]
      30:   89 d6                   mov    esi,edx
      32:   89 c7                   mov    edi,eax
      34:   e8 c7 ff ff ff          call   0 <add>
      39:   89 45 f4                mov    DWORD PTR [rbp-0xc],eax
      3c:   b8 00 00 00 00          mov    eax,0x0
    }
      41:   c9                      leave  
      42:   c3                      ret    
    

    二、如何使用函数内联进行优化
    -O 指令 或者 加上 inline关键字、来提示编译器进行函数内联

    内联带来的优化是、CPU需要执行的指令数变少了、根据地址跳转的过程不需要了、压栈和出栈的过程也不需要了

    但是内联意味着、把可复用的程序指令在调用它的地方完全展开了、若一个函数在很多地方都被调用了、就会被展开多次、整个程序占用的空间就会变大

    readelf -s link_example.o //查看符号表
    objdump -r link_example.o //查看重定位表
    

    相关文章

      网友评论

          本文标题:函数调用为何会发生栈溢出(第7讲)

          本文链接:https://www.haomeiwen.com/subject/xyvbdctx.html