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()