C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 哪个段是存储在ELF文件,数据段或其他中的虚拟表?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
众所周知,虚函数表指针通常存储在实例的前4个字节中.但我很好奇虚拟功能表存储在指定的ELF文件中的位置.我编写了以下程序进行测试,并使用readelf -s a.out命令获取ELF文件的符号表,但我找不到“vtable”或类似的东西.

#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,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;
}

解决方法

虚拟表存储在ELF文件的.rodata部分中,其相应的段在内存中被加载.

大佬总结

以上是大佬教程为你收集整理的c – 哪个段是存储在ELF文件,数据段或其他中的虚拟表?全部内容,希望文章能够帮你解决c – 哪个段是存储在ELF文件,数据段或其他中的虚拟表?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。