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

Max*_*Max 55 linux libraries

我有两个相关的问题:

  • 如何查看当前是否加载了共享库?(即系统范围的,进程不可知的)
  • 如何查看进程加载的所有共享库?

小智 58

您可以使用lsof. 要查看哪些进程打开或映射了库,请执行以下操作:

lsof /path/to/lib.so
Run Code Online (Sandbox Code Playgroud)

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

lsof -p <pid>
Run Code Online (Sandbox Code Playgroud)


Ric*_*lka 30

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


Cir*_*郝海东 9

sudo grep libcairo.so /proc/*/maps
Run Code Online (Sandbox Code Playgroud)

是一次探索/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
Run Code Online (Sandbox Code Playgroud)

进一步awk和 bash-fu 可以进一步细化输出。

此方法还示出了具有打开的库dlopen,以测试该最小设置入侵了一个sleep(1000)在Ubuntu 18.04。


Nob*_*rou 6

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

cat /proc/*/maps | awk '{print $6;}' | grep '\.so' | sort | uniq
Run Code Online (Sandbox Code Playgroud)

这适用于没有 lsof 的用户。