gpt4 book ai didi

c - Linux下动态加载库的地址范围

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:26:01 25 4
gpt4 key购买 nike

我有一个可以使用 dlopen 加载插件的工作程序。

新需求:在代码的某个点,我得到了一个指针,我需要测试这个指针是指向代码还是插件的静态数据。

bool is_pointer_into_plugin(void *p, void *handle);

同样,我需要检索指针指向的插件(如果有的话)。我还需要知道指针是否指向主程序的代码或静态数据(理想情况下,区分只读和读写区域)。

void *handle plugin_containing_pointer(void *p);

同样,我需要能够检索插件映射的范围(地址和大小)。我还需要主程序的这些信息。

我如何实现 is_pointer_into_pluginplugin_containing_pointer 或类似的东西?

如有必要,我可以更改对 dlopen 的调用。查找应该尽可能快,加载时代码不需要很快。在单独的进程中运行插件并通过共享内存进行通信不是一种选择。

我的程序在 Linux(和 Windows,但那是 another question)下运行。 future 对其他 unix 系统(至少对 OSX)的可移植性将是一个优势。

最佳答案

一种方法(完全特定于 Linux)是解析 /proc/self/maps (另见 Understanding Linux /proc/id/maps ),它描述了进程的内存映射。每个动态加载的库都有一个或多个条目(通常为 3 个),用于提供其地址范围、访问权限和文件名。下面是一个显示 C 库映射的示例:

f7622000-f7775000 r-xp 00000000 08:06 6950542                            /lib/tls/i686/cmov/libc-2.11.1.so
f7775000-f7777000 r--p 00153000 08:06 6950542 /lib/tls/i686/cmov/libc-2.11.1.so
f7777000-f7778000 rw-p 00155000 08:06 6950542 /lib/tls/i686/cmov/libc-2.11.1.so

第一列给出地址范围,第二列给出权限,第三列给出库(或主要可执行文件)的完整路径。最后一列为空或最后一列不是文件名的条目对应于非文件支持区域(堆栈、堆等)。权限r-xp表示代码,r--p为只读数据,rw-p为可变数据。

如果插件文件被重命名或删除,这将反射(reflect)在 /proc/self/maps 中。如果发生这种情况,为避免出现问题,请在调用 (dlopen) 后尽快阅读信息;请注意,存在不可避免的竞争条件。插件文件可以通过设备和 inode 来跟踪:打开文件,在 /dev/fd/NUM 上调用 dlopen,读取 /proc/self/maps ,将第4列和第5列与fstat得到的值进行比较。

关于c - Linux下动态加载库的地址范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12589443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com