1

我想解决的问题是将函数名列表映射到相应的成员函数指针。共享库中的成员函数指针地址

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

在.so文件:

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

偏移是的0x42。

但在运行时:

0x804d26e DoSomething 
0x804d29c checkReference 

偏移是0x2E之间。

函数之间的偏移量在某种程度上是不同的。为什么它有所不同?我想这个vtable是相同的,所以偏移量应该是相同的。

回答

0

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

0

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

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