如何查看Linux中当前已加载的共享对象?

如何查看Linux中当前已加载的共享对象?

我有两个相关的问题:

  • 如何查看共享库当前是否已加载?(即系统范围、与进程无关)
  • 如何查看进程加载的所有共享库?

答案1

您可以使用 来同时执行这两项操作lsof。要查看哪些进程打开或映射了库,请执行以下操作:

lsof /path/to/lib.so

要查看进程打开或映射了哪些文件(包括共享库),请执行以下操作:

lsof -p <pid>

答案2

查看进程中加载​​内容的另一种方法是查看文件/proc/PID/maps。这会显示映射到地址空间的所有内容,包括映射的共享对象。

答案3

sudo grep libcairo.so /proc/*/maps

是探索一切的好方法/proc/PID/maps Rich 提及一次。示例输出:

/proc/8390/maps:7f0a9afae000-7f0a9b0bc000 r-xp 00000000 fc:00 274690                     /usr/lib/x86_64-linux-gnu/libcairo.so.2.11400.6
/proc/8390/maps:7f0a9b0bc000-7f0a9b2bc000 ---p 0010e000 fc:00 274690                     /usr/lib/x86_64-linux-gnu/libcairo.so.2.11400.6
/proc/8390/maps:7f0a9b2bc000-7f0a9b2bf000 r--p 0010e000 fc:00 274690                     /usr/lib/x86_64-linux-gnu/libcairo.so.2.11400.6
/proc/8390/maps:7f0a9b2bf000-7f0a9b2c0000 rw-p 00111000 fc:00 274690                     /usr/lib/x86_64-linux-gnu/libcairo.so.2.11400.6
/proc/8466/maps:7f0a9afae000-7f0a9b0bc000 r-xp 00000000 fc:00 274690                     /usr/lib/x86_64-linux-gnu/libcairo.so.2.11400.6
/proc/8466/maps:7f0a9b0bc000-7f0a9b2bc000 ---p 0010e000 fc:00 274690                     /usr/lib/x86_64-linux-gnu/libcairo.so.2.11400.6
/proc/8466/maps:7f0a9b2bc000-7f0a9b2bf000 r--p 0010e000 fc:00 274690                     /usr/lib/x86_64-linux-gnu/libcairo.so.2.11400.6
/proc/8466/maps:7f0a9b2bf000-7f0a9b2c0000 rw-p 00111000 fc:00 274690                     /usr/lib/x86_64-linux-gnu/libcairo.so.2.11400.6

此外awk,bash-fu 可以进一步优化输出。

此方法还显示使用以下方式打开dlopen、测试的库这个最小的设置sleep(1000)在 Ubuntu 18.04 上被破解了。

答案4

您可以以 root 身份运行下一个命令并查看完整列表,

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

这适用于没有 lsof 的用户。

相关内容