Skip to content

C++ x64 ELF

Calling Convention

所有物件的 method 都會把物件放到第一個參數,而後才是 method 本身的參數


Vtable

如果一個 struct 有 virtual function

struct A {
    int a, b;
    void func0() {};
    virtual void func1() {};
    virtual void func2() {};
    virtual void func3() {};
}

那這個 struct 在記憶體的 memory 會長

| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | <- low address
|-------------------------------| 
|         vtable + 0x10         | 
|       b       |       a       | 

前 8 bytes 會指向 A 的 vtable + 0x10(this pointer 會指向這個 struct 也就是放 vtable + 0x10 的地方),然後接著是 struct 中的成員。而普通的 method func0 不會在 struct 的 memory 中

A 的 vtable 的 memory 會長

| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | <- low address
|-------------------------------| 
|               0               | 
|            typeinfo           | 
|            A::func1           | 
|            A::func2           | 
|            A::func3           | 

首先是 0,然後是一個 pointer 指到 A 的 typeinfo。接著(就是從 + 0x10 的位址開始)就是各個 virtual function pointer 的位址

如果有一個 struct 繼承了 A

struct B: A {
    virtual void func2 () override {}
}

B 的 vtable 就會長

| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | <- low address
|-------------------------------| 
|               0               | 
|            typeinfo           | 
|            A::func1           | 
|            B::func2           | 
|            A::func3           | 

Reference