我想解决的问题是制作一个函数名列表,映射到相应的成员函数指针。
我试图使用nm命令直接从.so文件获取函数指针,然后通过函数指针调用它们,但我无法成功完成。
在.so文件中:
0xd52=>DerivedModel::DoSomething()
0xd94=>DerivedModel::checkReference()
偏移量为0x42。
但是在运行时:
0x804d26e DoSomething
0x804d29c checkReference
偏移量为0x2E。
函数之间的偏移量有所不同。为什么会有所不同?我认为vtable是相同的,所以偏移应该是相同的。
答案 0 :(得分:0)
原因是nm返回符号的虚拟地址。共享库通常存储符号表,不同位置的数据部分(检查ELF格式)。 nm返回符号表的地址。 但是,当您加载库时,加载程序会查找符号表并为每个函数加载数据部分,以便在运行时更改地址偏移量。
答案 1 :(得分:0)
以下可能是符号表中的索引。
0xd52=>DerivedModel::DoSomething()
0xd94=>DerivedModel::checkReference()