如何获得指向动态库(Linux ELF)特定部分的指针?

Lui*_*BOL 4 c linux memory elf dynamic-library

该问题第二个答案中可以看出,使用节的名称从内部获取指向程序特定节的指针非常简单。使用libelf,只需打开程序自己的文件,循环访问其中的所有节(由Elf64_Shdrstruct 表示),当节名称与所需的节名称匹配时停止,并使用存储在struct sh_addr元素中的指针Elf64_Shdr。在这种情况下,获取所需的指针非常简单,因为它是在ELF可执行文件中定义的。

但是,假设您有一个使用动态库的程序,并且需要获取指向该动态库的一部分的指针。由于其节的地址是在运行时定义的,如何获得指向动态库节的指针?

顺便说一句,动态库和主程序本身每个都有一个具有相同名称的部分(这是我需要获得的指针所在的部分)。因此,在这种情况下,这两个同名的段是否可能相邻存储在内存中,所以我只需要获取指向主文件段的指针(如我在第一段中所述)并添加偏移量即可到达动态库部分?

Emp*_*ian 5

从自身内部获取指向程序特定部分的指针非常简单

不必要。在运行时实际上不需要节表,并且可以将其完全剥离(仅段很重要,节则不重要)。

由于其节的地址是在运行时定义的,如何获得指向动态库节的指针?

该库与主可执行文件完全没有区别。主要区别在于库通常链接到地址0(主可执行文件未链接),并由运行时加载程序重新定位到其他常数偏移量。

一旦知道了偏移量,只需将其添加到节开头(可以readelf -S foo.so从libelf或从libelf中找到),瞧:您已经获得了该节的运行时地址。

那么,如何找到给定共享库的重定位?

不雅的解决方案(已经由尼克建议)是要解析的/proc/self/maps

更好的解决方案是使用(特定于glibc的)dl_iterate_phdr。文档在这里。您将要使用dlpi_addr