2017-08-29 14 views
1
class Base { 
public: 
    Base() {} 
    virtual void Get() { } 
}; 

class Derivered : public Base { 
public: 
    virtual void Get() { } 
}; 

int main() { 
    Base* base = new Derivered(); 
    base->Get(); 
    return 0; 
} 

gcc 5.4.0を使用してコードをコンパイルし、objdump -S a.outを使用してバイナリファイルを逆アセンブルします。 Baseのvptrを探したいが、未知のアドレス0x80487d4しか表示しない。最大アドレス番号は0x80487b7です。わかりません。 コマンドリスト:g++ test.cpp -O0; objdump -S a.outVPTRをC++アセンブリコードで見つけるには?

080486fe <_ZN4BaseC1Ev>: 
80486fe: 55      push %ebp 
80486ff: 89 e5     mov %esp,%ebp 
8048701: ba d4 87 04 08   mov $0x80487d4,%edx 
8048706: 8b 45 08    mov 0x8(%ebp),%eax 
8048709: 89 10     mov %edx,(%eax) 
+3

は必ず最適化がオフになっていることを確認します。 –

+0

この[記事](http://phrack.org/issues/56/8.html)を読んでいますか? – perror

+1

このコンテキストのように最適化を行うと、コンパイラが関数呼び出しを無効にしてインライン化し、除外することもできます。 – WhiZTiM

答えて

0
080486fe <_ZN4BaseC1Ev>: 
    80486fe: 55      push %ebp 
    80486ff: 89 e5     mov %esp,%ebp 
    8048701: ba d4 87 04 08   mov $0x80487d4,%edx 
    8048706: 8b 45 08    mov 0x8(%ebp),%eax 
    8048709: 89 10     mov %edx,(%eax) 

は...

push %ebp    ;- save frame pointer 
mov %esp, %ebp  ;- mov esp-> ebp -ebp is frame pointer 
mov $0x80487d4, %edx ; load vptr address into edx 
mov 0x8(%ebp), %eax ; ld eax with address of this 
mov %edx,(%eax)  ; store vptr in this byte 0 
関連する問題