- 论坛徽章:
- 0
|
本帖最后由 李营长 于 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)- #include <cstring>
- #include <cstdio>
- #include <cstdlib>
- #include <string>
- #include <iostream>
- using namespace std;
- class Base
- {
- public:
- Base(int v) : val(v) { buff = (char*) malloc(val); printf("base::base\n"); }
- ~Base() { free(buff); }
- virtual void foo() { printf("base::val=%d\n", val); }
- private:
- int val;
- char* buff;
- };
- class Derive: public Base
- {
- public:
- Derive(const string& n) : name(n),Base(100) { printf("devive::derive\n"); }
- ~Derive() { }
- void foo() { printf("derive::name=%s\n", name.c_str()); }
- private:
- string name;
- };
- int main()
- {
- Derive d("deriveclass");
- d.foo();
- }
复制代码 最后生成有两个main....- cat virtual.s
- virtual.o: 文件格式 elf64-x86-64
- Disassembly of section .text:
- 0000000000000000 <main>:
- private:
- string name;
- };
- int [color=Red]main[/color]()
- {
- 0: 55 push %rbp
- 1: 48 89 e5 mov %rsp,%rbp
- 4: 53 push %rbx
- 5: 48 83 ec 38 sub $0x38,%rsp
- Derive d("deriveclass");
- 9: 48 8d 45 ef lea -0x11(%rbp),%rax
- d: 48 89 c7 mov %rax,%rdi
- 10: e8 00 00 00 00 callq 15 <main+0x15>
- 15: 48 8d 55 ef lea -0x11(%rbp),%rdx
- 19: 48 8d 45 e0 lea -0x20(%rbp),%rax
- 1d: be 00 00 00 00 mov $0x0,%esi
- 22: 48 89 c7 mov %rax,%rdi
- 25: e8 00 00 00 00 callq 2a <main+0x2a>
- 2a: 48 8d 55 e0 lea -0x20(%rbp),%rdx
- 2e: 48 8d 45 c0 lea -0x40(%rbp),%rax
- 32: 48 89 d6 mov %rdx,%rsi
- 35: 48 89 c7 mov %rax,%rdi
- 38: e8 00 00 00 00 callq 3d <main+0x3d>
- 3d: 48 8d 45 e0 lea -0x20(%rbp),%rax
- 41: 48 89 c7 mov %rax,%rdi
- 44: e8 00 00 00 00 callq 49 <main+0x49>
- 49: 48 8d 45 ef lea -0x11(%rbp),%rax
- 4d: 48 89 c7 mov %rax,%rdi
- 50: e8 00 00 00 00 callq 55 <main+0x55>
- d.foo();
- 55: 48 8d 45 c0 lea -0x40(%rbp),%rax
- 59: 48 89 c7 mov %rax,%rdi
- 5c: e8 00 00 00 00 callq 61 <main+0x61>
- 61: 48 8d 45 c0 lea -0x40(%rbp),%rax
- 65: 48 89 c7 mov %rax,%rdi
- 68: e8 00 00 00 00 callq 6d <main+0x6d>
- }
- 6d: b8 00 00 00 00 mov $0x0,%eax
- 72: eb 56 jmp ca <main+0xca>
- 74: 48 89 c3 mov %rax,%rbx
- 77: 48 8d 45 e0 lea -0x20(%rbp),%rax
- 7b: 48 89 c7 mov %rax,%rdi
- 7e: e8 00 00 00 00 callq 83 <main+0x83>
- 83: eb 14 jmp 99 <main+0x99>
- 85: 48 89 c3 mov %rax,%rbx
- 88: 48 8d 45 c0 lea -0x40(%rbp),%rax
- 8c: 48 89 c7 mov %rax,%rdi
- 8f: e8 00 00 00 00 callq 94 <main+0x94>
- 94: eb 03 jmp 99 <main+0x99>
- 96: 48 89 c3 mov %rax,%rbx
- 99: 48 8d 45 ef lea -0x11(%rbp),%rax
- 9d: 48 89 c7 mov %rax,%rdi
- a0: e8 00 00 00 00 callq a5 <main+0xa5>
- a5: 48 89 d8 mov %rbx,%rax
- a8: 48 89 c7 mov %rax,%rdi
- ab: e8 00 00 00 00 callq b0 <main+0xb0>
- b0: 48 89 c3 mov %rax,%rbx
- int [color=Red]main[/color]()
- {
- Derive d("deriveclass");
- d.foo();
- b3: 48 8d 45 c0 lea -0x40(%rbp),%rax
- b7: 48 89 c7 mov %rax,%rdi
- ba: e8 00 00 00 00 callq bf <main+0xbf>
- bf: 48 89 d8 mov %rbx,%rax
- c2: 48 89 c7 mov %rax,%rdi
- c5: e8 00 00 00 00 callq ca <main+0xca>
- }
- ca: 48 83 c4 38 add $0x38,%rsp
- ce: 5b pop %rbx
- cf: 5d pop %rbp
- d0: c3 retq
- 00000000000000d1 <_Z41__static_initialization_and_destruction_0ii>:
- d1: 55 push %rbp
- d2: 48 89 e5 mov %rsp,%rbp
- d5: 48 83 ec 10 sub $0x10,%rsp
- d9: 89 7d fc mov %edi,-0x4(%rbp)
- dc: 89 75 f8 mov %esi,-0x8(%rbp)
- df: 83 7d fc 01 cmpl $0x1,-0x4(%rbp)
- e3: 75 27 jne 10c <_Z41__static_initialization_and_destruction_0ii+0x3b>
- e5: 81 7d f8 ff ff 00 00 cmpl $0xffff,-0x8(%rbp)
- ec: 75 1e jne 10c <_Z41__static_initialization_and_destruction_0ii+0x3b>
- extern wostream wclog; /// Linked to standard error (buffered)
- #endif
- //@}
- // For construction of filebuffers for cout, cin, cerr, clog et. al.
- static ios_base::Init __ioinit;
- ee: bf 00 00 00 00 mov $0x0,%edi
- f3: e8 00 00 00 00 callq f8 <_Z41__static_initialization_and_destruction_0ii+0x27>
- f8: ba 00 00 00 00 mov $0x0,%edx
- fd: be 00 00 00 00 mov $0x0,%esi
- 102: bf 00 00 00 00 mov $0x0,%edi
- 107: e8 00 00 00 00 callq 10c <_Z41__static_initialization_and_destruction_0ii+0x3b>
- 10c: c9 leaveq
- 10d: c3 retq
- 000000000000010e <_GLOBAL__sub_I_main>:
- 10e: 55 push %rbp
- 10f: 48 89 e5 mov %rsp,%rbp
- 112: be ff ff 00 00 mov $0xffff,%esi
- 117: bf 01 00 00 00 mov $0x1,%edi
- 11c: e8 b0 ff ff ff callq d1 <_Z41__static_initialization_and_destruction_0ii>
- 121: 5d pop %rbp
- 122: c3 retq
- Disassembly of section .text._ZN4BaseC2Ei:
- 0000000000000000 <_ZN4BaseC1Ei>:
- #include <iostream>
- using namespace std;
- class Base
- {
- public:
- Base(int v) : val(v) { buff = (char*) malloc(val); printf("base::base\n"); }
- 0: 55 push %rbp
- 1: 48 89 e5 mov %rsp,%rbp
- 4: 48 83 ec 10 sub $0x10,%rsp
- 8: 48 89 7d f8 mov %rdi,-0x8(%rbp)
- c: 89 75 f4 mov %esi,-0xc(%rbp)
- f: 48 8b 45 f8 mov -0x8(%rbp),%rax
- 13: 48 c7 00 00 00 00 00 movq $0x0,(%rax)
- 1a: 48 8b 45 f8 mov -0x8(%rbp),%rax
- 1e: 8b 55 f4 mov -0xc(%rbp),%edx
- 21: 89 50 08 mov %edx,0x8(%rax)
- 24: 48 8b 45 f8 mov -0x8(%rbp),%rax
- 28: 8b 40 08 mov 0x8(%rax),%eax
- 2b: 48 98 cltq
- 2d: 48 89 c7 mov %rax,%rdi
- 30: e8 00 00 00 00 callq 35 <_ZN4BaseC1Ei+0x35>
- 35: 48 89 c2 mov %rax,%rdx
- 38: 48 8b 45 f8 mov -0x8(%rbp),%rax
- 3c: 48 89 50 10 mov %rdx,0x10(%rax)
- 40: bf 00 00 00 00 mov $0x0,%edi
- 45: e8 00 00 00 00 callq 4a <_ZN4BaseC1Ei+0x4a>
- 4a: c9 leaveq
- 4b: c3 retq
- Disassembly of section .text._ZN4BaseD2Ev:
- 0000000000000000 <_ZN4BaseD1Ev>:
- ~Base() { free(buff); }
- 0: 55 push %rbp
- 1: 48 89 e5 mov %rsp,%rbp
- 4: 48 83 ec 10 sub $0x10,%rsp
- 8: 48 89 7d f8 mov %rdi,-0x8(%rbp)
- c: 48 8b 45 f8 mov -0x8(%rbp),%rax
- 10: 48 c7 00 00 00 00 00 movq $0x0,(%rax)
- 17: 48 8b 45 f8 mov -0x8(%rbp),%rax
- 1b: 48 8b 40 10 mov 0x10(%rax),%rax
- 1f: 48 89 c7 mov %rax,%rdi
- 22: e8 00 00 00 00 callq 27 <_ZN4BaseD1Ev+0x27>
- 27: c9 leaveq
- 28: c3 retq
- Disassembly of section .text._ZN4Base3fooEv:
- 0000000000000000 <_ZN4Base3fooEv>:
- virtual void foo() { printf("base::val=%d\n", val); }
- 0: 55 push %rbp
- 1: 48 89 e5 mov %rsp,%rbp
- 4: 48 83 ec 10 sub $0x10,%rsp
- 8: 48 89 7d f8 mov %rdi,-0x8(%rbp)
- c: 48 8b 45 f8 mov -0x8(%rbp),%rax
- 10: 8b 40 08 mov 0x8(%rax),%eax
- 13: 89 c6 mov %eax,%esi
- 15: bf 00 00 00 00 mov $0x0,%edi
- 1a: b8 00 00 00 00 mov $0x0,%eax
- 1f: e8 00 00 00 00 callq 24 <_ZN4Base3fooEv+0x24>
- 24: c9 leaveq
- 25: c3 retq
- Disassembly of section .text._ZN6DeriveC2ERKSs:
- 0000000000000000 <_ZN6DeriveC1ERKSs>:
- };
- class Derive: public Base
- {
- public:
- Derive(const string& n) : name(n),Base(100) { printf("devive::derive\n"); }
- 0: 55 push %rbp
- 1: 48 89 e5 mov %rsp,%rbp
- 4: 53 push %rbx
- 5: 48 83 ec 18 sub $0x18,%rsp
- 9: 48 89 7d e8 mov %rdi,-0x18(%rbp)
- d: 48 89 75 e0 mov %rsi,-0x20(%rbp)
- 11: 48 8b 45 e8 mov -0x18(%rbp),%rax
- 15: be 64 00 00 00 mov $0x64,%esi
- 1a: 48 89 c7 mov %rax,%rdi
- 1d: e8 00 00 00 00 callq 22 <_ZN6DeriveC1ERKSs+0x22>
- 22: 48 8b 45 e8 mov -0x18(%rbp),%rax
- 26: 48 c7 00 00 00 00 00 movq $0x0,(%rax)
- 2d: 48 8b 45 e8 mov -0x18(%rbp),%rax
- 31: 48 8d 50 18 lea 0x18(%rax),%rdx
- 35: 48 8b 45 e0 mov -0x20(%rbp),%rax
- 39: 48 89 c6 mov %rax,%rsi
- 3c: 48 89 d7 mov %rdx,%rdi
- 3f: e8 00 00 00 00 callq 44 <_ZN6DeriveC1ERKSs+0x44>
- 44: bf 00 00 00 00 mov $0x0,%edi
- 49: e8 00 00 00 00 callq 4e <_ZN6DeriveC1ERKSs+0x4e>
- 4e: eb 2f jmp 7f <_ZN6DeriveC1ERKSs+0x7f>
- 50: 48 89 c3 mov %rax,%rbx
- 53: 48 8b 45 e8 mov -0x18(%rbp),%rax
- 57: 48 83 c0 18 add $0x18,%rax
- 5b: 48 89 c7 mov %rax,%rdi
- 5e: e8 00 00 00 00 callq 63 <_ZN6DeriveC1ERKSs+0x63>
- 63: eb 03 jmp 68 <_ZN6DeriveC1ERKSs+0x68>
- 65: 48 89 c3 mov %rax,%rbx
- 68: 48 8b 45 e8 mov -0x18(%rbp),%rax
- 6c: 48 89 c7 mov %rax,%rdi
- 6f: e8 00 00 00 00 callq 74 <_ZN6DeriveC1ERKSs+0x74>
- 74: 48 89 d8 mov %rbx,%rax
- 77: 48 89 c7 mov %rax,%rdi
- 7a: e8 00 00 00 00 callq 7f <_ZN6DeriveC1ERKSs+0x7f>
- 7f: 48 83 c4 18 add $0x18,%rsp
- 83: 5b pop %rbx
- 84: 5d pop %rbp
- 85: c3 retq
- Disassembly of section .text._ZN6DeriveD2Ev:
- 0000000000000000 <_ZN6DeriveD1Ev>:
- ~Derive() { }
- 0: 55 push %rbp
- 1: 48 89 e5 mov %rsp,%rbp
- 4: 53 push %rbx
- 5: 48 83 ec 18 sub $0x18,%rsp
- 9: 48 89 7d e8 mov %rdi,-0x18(%rbp)
- d: 48 8b 45 e8 mov -0x18(%rbp),%rax
- 11: 48 c7 00 00 00 00 00 movq $0x0,(%rax)
- 18: 48 8b 45 e8 mov -0x18(%rbp),%rax
- 1c: 48 83 c0 18 add $0x18,%rax
- 20: 48 89 c7 mov %rax,%rdi
- 23: e8 00 00 00 00 callq 28 <_ZN6DeriveD1Ev+0x28>
- 28: 48 8b 45 e8 mov -0x18(%rbp),%rax
- 2c: 48 89 c7 mov %rax,%rdi
- 2f: e8 00 00 00 00 callq 34 <_ZN6DeriveD1Ev+0x34>
- 34: eb 1a jmp 50 <_ZN6DeriveD1Ev+0x50>
- 36: 48 89 c3 mov %rax,%rbx
- 39: 48 8b 45 e8 mov -0x18(%rbp),%rax
- 3d: 48 89 c7 mov %rax,%rdi
- 40: e8 00 00 00 00 callq 45 <_ZN6DeriveD1Ev+0x45>
- 45: 48 89 d8 mov %rbx,%rax
- 48: 48 89 c7 mov %rax,%rdi
- 4b: e8 00 00 00 00 callq 50 <_ZN6DeriveD1Ev+0x50>
- 50: 48 83 c4 18 add $0x18,%rsp
- 54: 5b pop %rbx
- 55: 5d pop %rbp
- 56: c3 retq
- Disassembly of section .text._ZN6Derive3fooEv:
- 0000000000000000 <_ZN6Derive3fooEv>:
- void foo() { printf("derive::name=%s\n", name.c_str()); }
- 0: 55 push %rbp
- 1: 48 89 e5 mov %rsp,%rbp
- 4: 48 83 ec 10 sub $0x10,%rsp
- 8: 48 89 7d f8 mov %rdi,-0x8(%rbp)
- c: 48 8b 45 f8 mov -0x8(%rbp),%rax
- 10: 48 83 c0 18 add $0x18,%rax
- 14: 48 89 c7 mov %rax,%rdi
- 17: e8 00 00 00 00 callq 1c <_ZN6Derive3fooEv+0x1c>
- 1c: 48 89 c6 mov %rax,%rsi
- 1f: bf 00 00 00 00 mov $0x0,%edi
- 24: b8 00 00 00 00 mov $0x0,%eax
- 29: e8 00 00 00 00 callq 2e <_ZN6Derive3fooEv+0x2e>
- 2e: c9 leaveq
- 2f: c3 retq
复制代码 |
|