繁体   English   中英

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

[英]How to get a pointer to a specific section of a dynamic library (Linux ELF)?

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

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

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

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

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

由于其部分的地址是在运行时定义的,因此如何获取指向动态库部分的指针?

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

一旦你知道了这个偏移,只需将它添加到section start(你可以从readelf -S foo.so或libelf中找到),并且瞧:你已经得到了该部分的运行时地址。

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

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

更好的解决方案是使用(glibc特定的) dl_iterate_phdr 文档在这里 你会想要使用dlpi_addr

这很简单,这里是一个例子:

#include <stdio.h>

int i __attribute__((section("my_section"))) = 2;
int j __attribute__((section("my_section"))) = 3;
int k __attribute__((section("my_section"))) = 5;

extern int __start_my_section;
extern int __stop_my_section;

int main(void)
{
    int *p = &__start_my_section;

    printf("%d\n", *p++); /* print k value */
    printf("%d\n", *p++); /* print j value */
    printf("%d\n", *p);   /* print i value */

   return 0;
}   

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM