共享库中的成员函数指针地址

时间:2012-07-17 03:22:17

标签: c++ linux shared-libraries function-pointers member-function-pointers

我想解决的问题是制作一个函数名列表,映射到相应的成员函数指针。

我试图使用nm命令直接从.so文件获取函数指针,然后通过函数指针调用它们,但我无法成功完成。

在.so文件中:

0xd52=>DerivedModel::DoSomething()
0xd94=>DerivedModel::checkReference()

偏移量为0x42。

但是在运行时:

0x804d26e DoSomething
0x804d29c checkReference

偏移量为0x2E。

函数之间的偏移量有所不同。为什么会有所不同?我认为vtable是相同的,所以偏移应该是相同的。

2 个答案:

答案 0 :(得分:0)

原因是nm返回符号的虚拟地址。共享库通常存储符号表,不同位置的数据部分(检查ELF格式)。 nm返回符号表的地址。 但是,当您加载库时,加载程序会查找符号表并为每个函数加载数据部分,以便在运行时更改地址偏移量。

答案 1 :(得分:0)

以下可能是符号表中的索引。

0xd52=>DerivedModel::DoSomething()
0xd94=>DerivedModel::checkReference()