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

标签 c linux memory elf dynamic-library

second answer for this question中可以看出, 使用节的名称从自身内部获取指向程序特定节的指针非常简单。使用 libelf,只需打开程序自己的文件,循环遍历其中的所有部分(由 Elf64_Shdr 结构表示),当部分名称与您想要的部分匹配时停止,然后使用存储在 Elf64_Shdr 结构的 sh_addr 元素中的指针。在这种情况下,要获得想要的指针非常简单,因为它是在 ELF 可执行文件中定义的。

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

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

最佳答案

it's quite simple to get a pointer to an specific section of a program from within itself

不一定。节表在运行时实际上并不需要,并且可以完全剥离(只有段很重要,而不是节)。

Since the addresses of its sections are defined in runtime, how is it possible to get pointers to sections of a dynamic library?

库与主要的可执行文件没有任何不同。主要区别在于库通常链接在地址 0(主可执行文件不是),并且由运行时加载程序重定位到其他一些常量偏移量。

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

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

不优雅的解决方案(已由 Nick 建议)是解析 /proc/self/maps

更好的解决方案是使用(特定于 glibc 的)dl_iterate_phdr。文档 here .您需要使用 dlpi_addr

关于c - 如何获取指向动态库(Linux ELF)特定部分的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13371791/

相关文章:

c - 同时编译.pc和.c时makefile无故退出。很奇怪

c - C 中无符号短整型的加法和减法

c - 使用 mkstemp() 打开多个临时文件是否安全

c++ - "printf"在 Windows 非控制台应用程序中写在哪里?

linux - 在wireshark中解密SSL数据

node.js - Node : Check Machines OS while in Linux Bash on Windows 10

linux - 如何在hadoop中根据出生时间 move 文件

c - 是否可以使用 mmap 映射文件的一部分?

c - 为什么我的二维数组会导致 C 中的总线错误?

c++ - 简单的效率问题 C++(内存分配)..也许一些碰撞检测有帮助?