2013-06-26 2 views
3

Как мы все знаем, указатель таблицы виртуальных функций обычно хранится в первых 4 байтах в экземпляре. Но мне очень любопытно, где хранится таблица виртуальных функций в указанном файле ELF. Я написал следующую программу для тестирования, и я использовал команду readelf -s a.out, чтобы получить таблицу символов файла ELF, но я не могу найти «vtable» или что-то вроде этого.В каком сегменте находится виртуальная таблица, хранящаяся в файле ELF, сегменте данных или другом?

#include <iostream> 
#include <stdio.h> 
using namespace std; 

typedef void (*fun_pointer)(void); 
class Test 
{ 
public: 
    Test() 
    { 
     cout<<"Test()."<<endl; 
    } 
    virtual void print() 
    { 
     cout<<"Test::Virtual void print()."<<endl; 
    } 
    virtual void print2() 
    { 
     cout<<"Test::Virtual void print2()."<<endl; 
    } 


}; 

class TestDrived:public Test 
{ 
public: 
    TestDrived() 
    { 
     cout<<"TestDrived()."<<endl; 
    } 
    virtual void print() 
    { 
     cout<<"TestDrived::virtual void print()."<<endl; 
    } 
    virtual void print2() 
    { 
     cout<<"TestDrived::virutual void print2()."<<endl; 
    } 

    void GetVtblAddress() 
    { 
     cout<<"vtbl address:"<<(int*)this<<endl; 
    } 
    void GetFirstVtblFunctionAddress(void) 
    { 
     cout<<"First function address in vtbl:"<< (int*)*(int*)this+0; 
    } 
    void GetSecondVtblFunctionAddress(void) 
    { 
     cout<<"First function address in vtbl:"<< (int*)*(int*)this+2<<endl; //my os is 64bit //linux, if you use 32bit OS, please replace the "this+2" with "this+1" 
    } 
    void CallFirstVtblFunction() 
    { 
     fun = (fun_pointer)* ((int*)*(int*)this+0); 
     fun(); 
    } 
    void CallSecondVtblFunction() 
    { 
     fun = (fun_pointer)* ((int*)*(int*)this+2); //my os is 64bit 
     //linux, if you use 32bit OS, please replace the "this+2" with "this+1" 
     fun(); 
    } 
private: 
    fun_pointer fun; 
}; 


int main() 
{ 
    cout<<"sizeof(int):"<<sizeof(int)<<"sizeof(int*)"<<endl<<sizeof(int*)<<endl; 
    fun_pointer fun = NULL; 
    TestDrived a; 
    a.GetVtblAddress(); 
    a.GetFirstVtblFunctionAddress(); 
    a.GetSecondVtblFunctionAddress(); 
    a.CallFirstVtblFunction(); 
    a.CallSecondVtblFunction(); 
    return 0; 
} 
+1

Виртуальная таблица обычно должна быть инициализирована, поэтому в сегменте 'data', который я предполагаю. –

+0

http://stackoverflow.com/questions/6379166/how-to-extract-virtual-table-informations-from-a-shared-library – BoBTFish

ответ

0

Виртуальная таблица хранится в разделе .rodata файла ELF и соответствующий ему сегмент ЗАГРУЖАЕТСЯ в памяти.