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

标签 c++ linux shared-libraries function-pointers pointer-to-member

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

我试图通过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/

相关文章:

c++ - 使用 SIGTERM 的 kill() 系统调用不起作用

c++ - 从接口(interface)转换为实现接口(interface)的类的子类

linux - 如何截取 Linux plymouth 主题的屏幕截图(视频)

c++ - 范围互斥锁的自定义 RAII C++ 实现

linux - (Linux) date 命令的有效输入 DATE 格式是什么?

shared-libraries - 来自动态/静态库的可执行文件的大小

c++ - 当在 C++ 运行时确定精确形状时,如何将二维数组传递给外部函数?

c++ - openmp 共享或什么都没有。私有(private)与未初始化

c++ - 是否可以重新创建使用给定 .dll/.so/.dylib 所需的 C++ 头文件?

JavaCpp:如何指定 native 库?