免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2862 | 回复: 3

[C++] g++生成object,然后 objdump生成汇编代码有两个main函数 [复制链接]

论坛徽章:
0
发表于 2014-10-07 14:55 |显示全部楼层
本帖最后由 李营长 于 2014-10-07 14:56 编辑

最近在看C++对应的汇编代码,但是有的时候C++代码反汇编出来就不对了。

[xx@localhost cxx_asm]$ g++ -v
使用内建 specs。
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.3/lto-wrapper
目标:x86_64-redhat-linux
配置为:../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-isl=/builddir/build/BUILD/gcc-4.8.3-20140911/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.3-20140911/obj-x86_64-redhat-linux/cloog-install --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
线程模型:posix
gcc 版本 4.8.3 20140911 (Red Hat 4.8.3-7) (GCC)
  1. #include <cstring>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <string>
  5. #include <iostream>
  6. using namespace std;
  7. class Base
  8. {
  9. public:
  10.   Base(int v) : val(v) { buff = (char*) malloc(val); printf("base::base\n"); }
  11.   ~Base() { free(buff); }
  12.   virtual void foo() { printf("base::val=%d\n", val); }
  13. private:
  14.   int val;
  15.   char* buff;
  16. };

  17. class Derive: public Base
  18. {
  19. public:
  20.   Derive(const string& n) : name(n),Base(100) { printf("devive::derive\n"); }
  21.   ~Derive() { }
  22.   void foo() { printf("derive::name=%s\n", name.c_str()); }
  23. private:
  24.   string name;
  25. };

  26. int main()
  27. {

  28.   Derive d("deriveclass");
  29.   d.foo();

  30. }
复制代码
最后生成有两个main....
  1. cat virtual.s

  2. virtual.o:     文件格式 elf64-x86-64


  3. Disassembly of section .text:

  4. 0000000000000000 <main>:
  5. private:
  6.   string name;
  7. };

  8. int [color=Red]main[/color]()
  9. {
  10.    0:        55                           push   %rbp
  11.    1:        48 89 e5                     mov    %rsp,%rbp
  12.    4:        53                           push   %rbx
  13.    5:        48 83 ec 38                  sub    $0x38,%rsp

  14.   Derive d("deriveclass");
  15.    9:        48 8d 45 ef                  lea    -0x11(%rbp),%rax
  16.    d:        48 89 c7                     mov    %rax,%rdi
  17.   10:        e8 00 00 00 00               callq  15 <main+0x15>
  18.   15:        48 8d 55 ef                  lea    -0x11(%rbp),%rdx
  19.   19:        48 8d 45 e0                  lea    -0x20(%rbp),%rax
  20.   1d:        be 00 00 00 00               mov    $0x0,%esi
  21.   22:        48 89 c7                     mov    %rax,%rdi
  22.   25:        e8 00 00 00 00               callq  2a <main+0x2a>
  23.   2a:        48 8d 55 e0                  lea    -0x20(%rbp),%rdx
  24.   2e:        48 8d 45 c0                  lea    -0x40(%rbp),%rax
  25.   32:        48 89 d6                     mov    %rdx,%rsi
  26.   35:        48 89 c7                     mov    %rax,%rdi
  27.   38:        e8 00 00 00 00               callq  3d <main+0x3d>
  28.   3d:        48 8d 45 e0                  lea    -0x20(%rbp),%rax
  29.   41:        48 89 c7                     mov    %rax,%rdi
  30.   44:        e8 00 00 00 00               callq  49 <main+0x49>
  31.   49:        48 8d 45 ef                  lea    -0x11(%rbp),%rax
  32.   4d:        48 89 c7                     mov    %rax,%rdi
  33.   50:        e8 00 00 00 00               callq  55 <main+0x55>
  34.   d.foo();
  35.   55:        48 8d 45 c0                  lea    -0x40(%rbp),%rax
  36.   59:        48 89 c7                     mov    %rax,%rdi
  37.   5c:        e8 00 00 00 00               callq  61 <main+0x61>
  38.   61:        48 8d 45 c0                  lea    -0x40(%rbp),%rax
  39.   65:        48 89 c7                     mov    %rax,%rdi
  40.   68:        e8 00 00 00 00               callq  6d <main+0x6d>

  41. }
  42.   6d:        b8 00 00 00 00               mov    $0x0,%eax
  43.   72:        eb 56                        jmp    ca <main+0xca>
  44.   74:        48 89 c3                     mov    %rax,%rbx
  45.   77:        48 8d 45 e0                  lea    -0x20(%rbp),%rax
  46.   7b:        48 89 c7                     mov    %rax,%rdi
  47.   7e:        e8 00 00 00 00               callq  83 <main+0x83>
  48.   83:        eb 14                        jmp    99 <main+0x99>
  49.   85:        48 89 c3                     mov    %rax,%rbx
  50.   88:        48 8d 45 c0                  lea    -0x40(%rbp),%rax
  51.   8c:        48 89 c7                     mov    %rax,%rdi
  52.   8f:        e8 00 00 00 00               callq  94 <main+0x94>
  53.   94:        eb 03                        jmp    99 <main+0x99>
  54.   96:        48 89 c3                     mov    %rax,%rbx
  55.   99:        48 8d 45 ef                  lea    -0x11(%rbp),%rax
  56.   9d:        48 89 c7                     mov    %rax,%rdi
  57.   a0:        e8 00 00 00 00               callq  a5 <main+0xa5>
  58.   a5:        48 89 d8                     mov    %rbx,%rax
  59.   a8:        48 89 c7                     mov    %rax,%rdi
  60.   ab:        e8 00 00 00 00               callq  b0 <main+0xb0>
  61.   b0:        48 89 c3                     mov    %rax,%rbx

  62. int [color=Red]main[/color]()
  63. {

  64.   Derive d("deriveclass");
  65.   d.foo();
  66.   b3:        48 8d 45 c0                  lea    -0x40(%rbp),%rax
  67.   b7:        48 89 c7                     mov    %rax,%rdi
  68.   ba:        e8 00 00 00 00               callq  bf <main+0xbf>
  69.   bf:        48 89 d8                     mov    %rbx,%rax
  70.   c2:        48 89 c7                     mov    %rax,%rdi
  71.   c5:        e8 00 00 00 00               callq  ca <main+0xca>

  72. }
  73.   ca:        48 83 c4 38                  add    $0x38,%rsp
  74.   ce:        5b                           pop    %rbx
  75.   cf:        5d                           pop    %rbp
  76.   d0:        c3                           retq   

  77. 00000000000000d1 <_Z41__static_initialization_and_destruction_0ii>:
  78.   d1:        55                           push   %rbp
  79.   d2:        48 89 e5                     mov    %rsp,%rbp
  80.   d5:        48 83 ec 10                  sub    $0x10,%rsp
  81.   d9:        89 7d fc                     mov    %edi,-0x4(%rbp)
  82.   dc:        89 75 f8                     mov    %esi,-0x8(%rbp)
  83.   df:        83 7d fc 01                  cmpl   $0x1,-0x4(%rbp)
  84.   e3:        75 27                        jne    10c <_Z41__static_initialization_and_destruction_0ii+0x3b>
  85.   e5:        81 7d f8 ff ff 00 00         cmpl   $0xffff,-0x8(%rbp)
  86.   ec:        75 1e                        jne    10c <_Z41__static_initialization_and_destruction_0ii+0x3b>
  87.   extern wostream wclog;        /// Linked to standard error (buffered)
  88. #endif
  89.   //@}

  90.   // For construction of filebuffers for cout, cin, cerr, clog et. al.
  91.   static ios_base::Init __ioinit;
  92.   ee:        bf 00 00 00 00               mov    $0x0,%edi
  93.   f3:        e8 00 00 00 00               callq  f8 <_Z41__static_initialization_and_destruction_0ii+0x27>
  94.   f8:        ba 00 00 00 00               mov    $0x0,%edx
  95.   fd:        be 00 00 00 00               mov    $0x0,%esi
  96. 102:        bf 00 00 00 00               mov    $0x0,%edi
  97. 107:        e8 00 00 00 00               callq  10c <_Z41__static_initialization_and_destruction_0ii+0x3b>
  98. 10c:        c9                           leaveq
  99. 10d:        c3                           retq   

  100. 000000000000010e <_GLOBAL__sub_I_main>:
  101. 10e:        55                           push   %rbp
  102. 10f:        48 89 e5                     mov    %rsp,%rbp
  103. 112:        be ff ff 00 00               mov    $0xffff,%esi
  104. 117:        bf 01 00 00 00               mov    $0x1,%edi
  105. 11c:        e8 b0 ff ff ff               callq  d1 <_Z41__static_initialization_and_destruction_0ii>
  106. 121:        5d                           pop    %rbp
  107. 122:        c3                           retq   

  108. Disassembly of section .text._ZN4BaseC2Ei:

  109. 0000000000000000 <_ZN4BaseC1Ei>:
  110. #include <iostream>
  111. using namespace std;
  112. class Base
  113. {
  114. public:
  115.   Base(int v) : val(v) { buff = (char*) malloc(val); printf("base::base\n"); }
  116.    0:        55                           push   %rbp
  117.    1:        48 89 e5                     mov    %rsp,%rbp
  118.    4:        48 83 ec 10                  sub    $0x10,%rsp
  119.    8:        48 89 7d f8                  mov    %rdi,-0x8(%rbp)
  120.    c:        89 75 f4                     mov    %esi,-0xc(%rbp)
  121.    f:        48 8b 45 f8                  mov    -0x8(%rbp),%rax
  122.   13:        48 c7 00 00 00 00 00         movq   $0x0,(%rax)
  123.   1a:        48 8b 45 f8                  mov    -0x8(%rbp),%rax
  124.   1e:        8b 55 f4                     mov    -0xc(%rbp),%edx
  125.   21:        89 50 08                     mov    %edx,0x8(%rax)
  126.   24:        48 8b 45 f8                  mov    -0x8(%rbp),%rax
  127.   28:        8b 40 08                     mov    0x8(%rax),%eax
  128.   2b:        48 98                        cltq   
  129.   2d:        48 89 c7                     mov    %rax,%rdi
  130.   30:        e8 00 00 00 00               callq  35 <_ZN4BaseC1Ei+0x35>
  131.   35:        48 89 c2                     mov    %rax,%rdx
  132.   38:        48 8b 45 f8                  mov    -0x8(%rbp),%rax
  133.   3c:        48 89 50 10                  mov    %rdx,0x10(%rax)
  134.   40:        bf 00 00 00 00               mov    $0x0,%edi
  135.   45:        e8 00 00 00 00               callq  4a <_ZN4BaseC1Ei+0x4a>
  136.   4a:        c9                           leaveq
  137.   4b:        c3                           retq   

  138. Disassembly of section .text._ZN4BaseD2Ev:

  139. 0000000000000000 <_ZN4BaseD1Ev>:
  140.   ~Base() { free(buff); }
  141.    0:        55                           push   %rbp
  142.    1:        48 89 e5                     mov    %rsp,%rbp
  143.    4:        48 83 ec 10                  sub    $0x10,%rsp
  144.    8:        48 89 7d f8                  mov    %rdi,-0x8(%rbp)
  145.    c:        48 8b 45 f8                  mov    -0x8(%rbp),%rax
  146.   10:        48 c7 00 00 00 00 00         movq   $0x0,(%rax)
  147.   17:        48 8b 45 f8                  mov    -0x8(%rbp),%rax
  148.   1b:        48 8b 40 10                  mov    0x10(%rax),%rax
  149.   1f:        48 89 c7                     mov    %rax,%rdi
  150.   22:        e8 00 00 00 00               callq  27 <_ZN4BaseD1Ev+0x27>
  151.   27:        c9                           leaveq
  152.   28:        c3                           retq   

  153. Disassembly of section .text._ZN4Base3fooEv:

  154. 0000000000000000 <_ZN4Base3fooEv>:
  155.   virtual void foo() { printf("base::val=%d\n", val); }
  156.    0:        55                           push   %rbp
  157.    1:        48 89 e5                     mov    %rsp,%rbp
  158.    4:        48 83 ec 10                  sub    $0x10,%rsp
  159.    8:        48 89 7d f8                  mov    %rdi,-0x8(%rbp)
  160.    c:        48 8b 45 f8                  mov    -0x8(%rbp),%rax
  161.   10:        8b 40 08                     mov    0x8(%rax),%eax
  162.   13:        89 c6                        mov    %eax,%esi
  163.   15:        bf 00 00 00 00               mov    $0x0,%edi
  164.   1a:        b8 00 00 00 00               mov    $0x0,%eax
  165.   1f:        e8 00 00 00 00               callq  24 <_ZN4Base3fooEv+0x24>
  166.   24:        c9                           leaveq
  167.   25:        c3                           retq   

  168. Disassembly of section .text._ZN6DeriveC2ERKSs:

  169. 0000000000000000 <_ZN6DeriveC1ERKSs>:
  170. };

  171. class Derive: public Base
  172. {
  173. public:
  174.   Derive(const string& n) : name(n),Base(100) { printf("devive::derive\n"); }
  175.    0:        55                           push   %rbp
  176.    1:        48 89 e5                     mov    %rsp,%rbp
  177.    4:        53                           push   %rbx
  178.    5:        48 83 ec 18                  sub    $0x18,%rsp
  179.    9:        48 89 7d e8                  mov    %rdi,-0x18(%rbp)
  180.    d:        48 89 75 e0                  mov    %rsi,-0x20(%rbp)
  181.   11:        48 8b 45 e8                  mov    -0x18(%rbp),%rax
  182.   15:        be 64 00 00 00               mov    $0x64,%esi
  183.   1a:        48 89 c7                     mov    %rax,%rdi
  184.   1d:        e8 00 00 00 00               callq  22 <_ZN6DeriveC1ERKSs+0x22>
  185.   22:        48 8b 45 e8                  mov    -0x18(%rbp),%rax
  186.   26:        48 c7 00 00 00 00 00         movq   $0x0,(%rax)
  187.   2d:        48 8b 45 e8                  mov    -0x18(%rbp),%rax
  188.   31:        48 8d 50 18                  lea    0x18(%rax),%rdx
  189.   35:        48 8b 45 e0                  mov    -0x20(%rbp),%rax
  190.   39:        48 89 c6                     mov    %rax,%rsi
  191.   3c:        48 89 d7                     mov    %rdx,%rdi
  192.   3f:        e8 00 00 00 00               callq  44 <_ZN6DeriveC1ERKSs+0x44>
  193.   44:        bf 00 00 00 00               mov    $0x0,%edi
  194.   49:        e8 00 00 00 00               callq  4e <_ZN6DeriveC1ERKSs+0x4e>
  195.   4e:        eb 2f                        jmp    7f <_ZN6DeriveC1ERKSs+0x7f>
  196.   50:        48 89 c3                     mov    %rax,%rbx
  197.   53:        48 8b 45 e8                  mov    -0x18(%rbp),%rax
  198.   57:        48 83 c0 18                  add    $0x18,%rax
  199.   5b:        48 89 c7                     mov    %rax,%rdi
  200.   5e:        e8 00 00 00 00               callq  63 <_ZN6DeriveC1ERKSs+0x63>
  201.   63:        eb 03                        jmp    68 <_ZN6DeriveC1ERKSs+0x68>
  202.   65:        48 89 c3                     mov    %rax,%rbx
  203.   68:        48 8b 45 e8                  mov    -0x18(%rbp),%rax
  204.   6c:        48 89 c7                     mov    %rax,%rdi
  205.   6f:        e8 00 00 00 00               callq  74 <_ZN6DeriveC1ERKSs+0x74>
  206.   74:        48 89 d8                     mov    %rbx,%rax
  207.   77:        48 89 c7                     mov    %rax,%rdi
  208.   7a:        e8 00 00 00 00               callq  7f <_ZN6DeriveC1ERKSs+0x7f>
  209.   7f:        48 83 c4 18                  add    $0x18,%rsp
  210.   83:        5b                           pop    %rbx
  211.   84:        5d                           pop    %rbp
  212.   85:        c3                           retq   

  213. Disassembly of section .text._ZN6DeriveD2Ev:

  214. 0000000000000000 <_ZN6DeriveD1Ev>:
  215.   ~Derive() { }
  216.    0:        55                           push   %rbp
  217.    1:        48 89 e5                     mov    %rsp,%rbp
  218.    4:        53                           push   %rbx
  219.    5:        48 83 ec 18                  sub    $0x18,%rsp
  220.    9:        48 89 7d e8                  mov    %rdi,-0x18(%rbp)
  221.    d:        48 8b 45 e8                  mov    -0x18(%rbp),%rax
  222.   11:        48 c7 00 00 00 00 00         movq   $0x0,(%rax)
  223.   18:        48 8b 45 e8                  mov    -0x18(%rbp),%rax
  224.   1c:        48 83 c0 18                  add    $0x18,%rax
  225.   20:        48 89 c7                     mov    %rax,%rdi
  226.   23:        e8 00 00 00 00               callq  28 <_ZN6DeriveD1Ev+0x28>
  227.   28:        48 8b 45 e8                  mov    -0x18(%rbp),%rax
  228.   2c:        48 89 c7                     mov    %rax,%rdi
  229.   2f:        e8 00 00 00 00               callq  34 <_ZN6DeriveD1Ev+0x34>
  230.   34:        eb 1a                        jmp    50 <_ZN6DeriveD1Ev+0x50>
  231.   36:        48 89 c3                     mov    %rax,%rbx
  232.   39:        48 8b 45 e8                  mov    -0x18(%rbp),%rax
  233.   3d:        48 89 c7                     mov    %rax,%rdi
  234.   40:        e8 00 00 00 00               callq  45 <_ZN6DeriveD1Ev+0x45>
  235.   45:        48 89 d8                     mov    %rbx,%rax
  236.   48:        48 89 c7                     mov    %rax,%rdi
  237.   4b:        e8 00 00 00 00               callq  50 <_ZN6DeriveD1Ev+0x50>
  238.   50:        48 83 c4 18                  add    $0x18,%rsp
  239.   54:        5b                           pop    %rbx
  240.   55:        5d                           pop    %rbp
  241.   56:        c3                           retq   

  242. Disassembly of section .text._ZN6Derive3fooEv:

  243. 0000000000000000 <_ZN6Derive3fooEv>:
  244.   void foo() { printf("derive::name=%s\n", name.c_str()); }
  245.    0:        55                           push   %rbp
  246.    1:        48 89 e5                     mov    %rsp,%rbp
  247.    4:        48 83 ec 10                  sub    $0x10,%rsp
  248.    8:        48 89 7d f8                  mov    %rdi,-0x8(%rbp)
  249.    c:        48 8b 45 f8                  mov    -0x8(%rbp),%rax
  250.   10:        48 83 c0 18                  add    $0x18,%rax
  251.   14:        48 89 c7                     mov    %rax,%rdi
  252.   17:        e8 00 00 00 00               callq  1c <_ZN6Derive3fooEv+0x1c>
  253.   1c:        48 89 c6                     mov    %rax,%rsi
  254.   1f:        bf 00 00 00 00               mov    $0x0,%edi
  255.   24:        b8 00 00 00 00               mov    $0x0,%eax
  256.   29:        e8 00 00 00 00               callq  2e <_ZN6Derive3fooEv+0x2e>
  257.   2e:        c9                           leaveq
  258.   2f:        c3                           retq   
复制代码

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
发表于 2014-10-08 09:34 |显示全部楼层
反汇编的姿势不对吧

论坛徽章:
0
发表于 2014-10-08 20:34 |显示全部楼层
回复 2# koolcoy


      要老树盘根才行?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
发表于 2014-10-09 00:32 |显示全部楼层
回复 3# 李营长

不清楚你objdump的参数咋传的,反正我objdump出来的结果完全不是这个样子的
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP