我要解决的问题是制作一个函数名列表,映射到相应的成员函数指针。
我试图通过nm命令直接从.so文件中获取函数指针,然后通过函数指针调用它们,但是我无法成功。
在.so文件中:
0xd52=>DerivedModel::DoSomething()
0xd94=>DerivedModel::checkReference()
偏移量为 0x42。
但是在运行时:
0x804d26e DoSomething
0x804d29c checkReference
偏移量为 0x2E。
函数之间的偏移量在某种程度上是不同的。为什么要不同?我想 vtable 是相同的,所以偏移量应该是相同的。
最佳答案
原因是 nm 返回符号的虚拟地址。共享库通常在不同的地方存储符号表、数据段(查看ELF 格式)。 nm 返回符号表的地址。 但是,当您加载库时,加载程序会查找符号表并为每个函数加载数据部分,因此地址偏移量会在运行时发生变化。
关于c++ - 共享库中的成员函数指针地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11515587/