有没有办法检查哪些库是正在运行的进程?
更具体地说,如果程序使用 dlopen 加载一些共享库,则 readelf 或 ldd 不会显示它。是否有可能从正在运行的进程中获取该信息?如果是,如何?
原文由 BЈовић 发布,翻译遵循 CC BY-SA 4.0 许可协议
有没有办法检查哪些库是正在运行的进程?
更具体地说,如果程序使用 dlopen 加载一些共享库,则 readelf 或 ldd 不会显示它。是否有可能从正在运行的进程中获取该信息?如果是,如何?
原文由 BЈовић 发布,翻译遵循 CC BY-SA 4.0 许可协议
实际上,您可以通过以下方式在代码中执行此操作:
#include <link.h>
using UnknownStruct = struct unknown_struct {
void* pointers[3];
struct unknown_struct* ptr;
};
using LinkMap = struct link_map;
auto* handle = dlopen(NULL, RTLD_NOW);
auto* p = reinterpret_cast<UnknownStruct*>(handle)->ptr;
auto* map = reinterpret_cast<LinkMap*>(p->ptr);
while (map) {
std::cout << map->l_name << std::endl;
// do something with |map| like with handle, returned by |dlopen()|.
map = map->l_next;
}
link_map
结构至少包含基地址和绝对文件名。它实际上是由 dlopen()
返回的结构,第一个参数非 NULL。有关更多详细信息,请参见 此处。
原文由 abyss.7 发布,翻译遵循 CC BY-SA 3.0 许可协议
7 回答5.3k 阅读
3 回答2k 阅读✓ 已解决
4 回答4k 阅读
2 回答3.9k 阅读✓ 已解决
2 回答5.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
其他人在正确的轨道上。这里有几种方法。
或者,使用 strace:
这两个都假设共享库在其路径中的某处有“.so”,但您可以修改它。第一个给出了相当漂亮的输出,只是一个库列表,每行一个。第二个将在打开时继续列出库,这很好。
当然
lsof
…