Как мы все знаем, указатель таблицы виртуальных функций обычно хранится в первых 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;
}
Виртуальная таблица обычно должна быть инициализирована, поэтому в сегменте 'data', который я предполагаю. –
http://stackoverflow.com/questions/6379166/how-to-extract-virtual-table-informations-from-a-shared-library – BoBTFish