【发布时间】:2012-11-14 01:33:56
【问题描述】:
从second answer for this question 中可以看出,使用节的名称从程序内部获取指向程序特定节的指针非常简单。使用libelf,只需打开程序自己的文件,循环其中的所有部分(由Elf64_Shdr 结构表示),当部分名称与您想要的匹配时停止并使用存储在sh_addr 元素中的指针Elf64_Shdr 结构的。在这种情况下,获取想要的指针非常简单,因为它是在 ELF 可执行文件中定义的。
但是,假设您有一个使用动态库的程序,并且您需要获取指向该动态库的某个部分的指针。既然它的section的地址是在运行时定义的,那么如何获得指向动态库section的指针呢?
顺便说一句,动态库和主程序本身都有一个同名的部分(这是我需要获得指针的部分)。那么,在这种情况下,这两个具有相同名称的部分是否有可能在内存中相邻存储,所以我只需要获取指向主文件部分的指针(正如我在第一段中解释的那样)并添加一个偏移量到达动态库部分?
【问题讨论】:
-
你可以从/proc/
/maps中获取起始地址,然后添加偏移量即可。 -
@Nick 好的,但是偏移量使用什么值?考虑到我可以使用
libelf获取起始地址,难道没有更优雅的方法吗? -
我什至不确定两个同名的部分,一个是主文件,另一个是库,是否相邻存储(它们肯定不是)。所以我什至不知道使用偏移量是否会起作用......
-
你为什么要问?有时,使用
dladdr就足够了......
标签: c linux memory elf dynamic-library