如何检查给定进程在运行时加载了哪些共享库?

新手上路,请多包涵

有没有办法检查哪些库是正在运行的进程?

更具体地说,如果程序使用 dlopen 加载一些共享库,则 readelf 或 ldd 不会显示它。是否有可能从正在运行的进程中获取该信息?如果是,如何?

原文由 BЈовић 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 614
2 个回答

其他人在正确的轨道上。这里有几种方法。

 cat /proc/NNNN/maps | awk '{print $6}' | grep '\.so' | sort | uniq

或者,使用 strace:

 strace CMD.... 2>&1 | grep -E '^open(at)?\(.*\.so'

这两个都假设共享库在其路径中的某处有“.so”,但您可以修改它。第一个给出了相当漂亮的输出,只是一个库列表,每行一个。第二个将在打开时继续列出库,这很好。

当然 lsof

 lsof -p NNNN | awk '{print $9}' | grep '\.so'

原文由 Dietrich Epp 发布,翻译遵循 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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题