C语言基础教程 之 查看可执行文件所依赖的动态库

本文详细介绍如何在Windows和Linux平台上检查程序依赖的动态库或共享库。在Windows上,利用DependencyWalker工具全面解析exe文件依赖;在Linux环境中,通过ldd、objdump、pldd及pmap命令深入探索可执行文件和运行进程的库依赖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


C语言基础教程目录:https://blog.youkuaiyun.com/SparkLee2013/article/details/85229406


1、Windows平台查看exe文件所依赖的动态库

1)工具下载

下载exe文件依赖库查看工具Dependency Walker,此软件是免费的

Dependency Walker官方下载地址:http://www.dependencywalker.com/

2)工具使用

启动Dependency Walker -> File -> Open:打开需要查看的文件,如:main.exe

在Dependency Walker工具界面中,我们可以看到被检测文件(main.exe)所依赖的所有动态库,并且列举出了的每个依赖库所提供的函数,如上述main.exe依赖了动态库"c:\windows\system32\msvcrt.dll",并且可以看到此动态库提供了"printf"等函数。

事实上,Dependency Walker不仅仅可以查看.exe文件所依赖的动态库,它其实是可以查看任意32位 或 64位 Windows模块文件(包括:exe, dll, ocx, sys, 等等)所依赖的动态库的。

2、Linux平台查看可执行文件所依赖的共享库

1)使用ldd查看可执行文件所依赖的共享库

# 查看php依赖的共享库
[admin@spk php]$ ldd bin/php
	linux-vdso.so.1 =>  (0x00007fffe6ba9000)
	libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f0605252000)
	libz.so.1 => /lib64/libz.so.1 (0x00007f060503c000)
	libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f0604e21000)
	libreadline.so.6 => /lib64/libreadline.so.6 (0x00007f0604bdb000)
	libncurses.so.5 => /lib64/libncurses.so.5 (0x00007f06049b4000)
	libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f0604789000)
	librt.so.1 => /lib64/librt.so.1 (0x00007f0604581000)
	libmcrypt.so.4 => /lib64/libmcrypt.so.4 (0x00007f060434f000)
	libpng15.so.15 => /lib64/libpng15.so.15 (0x00007f0604123000)
	libjpeg.so.62 => /lib64/libjpeg.so.62 (0x00007f0603ece000)
	libcurl.so.4 => /lib64/libcurl.so.4 (0x00007f0603c65000)
	libm.so.6 => /lib64/libm.so.6 (0x00007f0603962000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f060375e000)
	libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f0603545000)
	libxml2.so.2 => /lib64/libxml2.so.2 (0x00007f06031da000)
	libssl.so.10 => /lib64/libssl.so.10 (0x00007f0602f68000)
	libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007f0602b07000)
	libfreetype.so.6 => /lib64/libfreetype.so.6 (0x00007f0602847000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f0602484000)
	libfreebl3.so => /lib64/libfreebl3.so (0x00007f0602281000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f0602064000)
	libidn.so.11 => /lib64/libidn.so.11 (0x00007f0601e31000)
......

2)使用objdump查看可执行文件所依赖的共享库

# 查看php依赖的共享库
[admin@spk php]$ sudo objdump -p bin/php | grep NEED
  NEEDED               libcrypt.so.1
  NEEDED               libz.so.1
  NEEDED               libresolv.so.2
  NEEDED               libreadline.so.6
  NEEDED               libncurses.so.5
  NEEDED               libtinfo.so.5
  NEEDED               librt.so.1
  NEEDED               libmcrypt.so.4
  NEEDED               libpng15.so.15
  NEEDED               libjpeg.so.62
  NEEDED               libcurl.so.4
  NEEDED               libm.so.6
  NEEDED               libdl.so.2
  NEEDED               libnsl.so.1
  NEEDED               libxml2.so.2
  NEEDED               libssl.so.10
  NEEDED               libcrypto.so.10
  NEEDED               libfreetype.so.6
  NEEDED               libc.so.6
  VERNEED              0x0000000000424600
  VERNEEDNUM           0x0000000000000009

3)使用pldd查看运行进程所依赖的共享库

# 查看php进程所依赖的共享库
[admin@spk php]$ ps aux | grep php
root      2233  0.0  0.0 229456  4968 ?        Ss   11:24   0:00 php-fpm: master process (/home/admin/app/php/etc/php-fpm.conf)

[admin@spk php]$ sudo pldd 2233
2233:	/home/admin/app/php/sbin/php-fpm
linux-vdso.so.1
/lib64/libcrypt.so.1
/lib64/libresolv.so.2
/lib64/libreadline.so.6
/lib64/libncurses.so.5
/lib64/libtinfo.so.5
/lib64/libmcrypt.so.4
/lib64/libpng15.so.15
/lib64/libjpeg.so.62
/lib64/libcurl.so.4
/lib64/libxml2.so.2
/lib64/libssl.so.10
/lib64/libcrypto.so.10
/lib64/libfreetype.so.6
/lib64/libc.so.6
/lib64/libfreebl3.so
/lib64/libpthread.so.0
/lib64/libselinux.so.1
/lib64/libpcre.so.1
/home/admin/app/php/lib/php/extensions/no-debug-non-zts-20131226/memcache.so
/home/admin/app/php/lib/php/extensions/no-debug-non-zts-20131226/seaslog.so
......

4)使用pmap查看运行进程所依赖的共享库

# 查看php进程所依赖的共享库
[admin@spk php]$ ps aux | grep php
root      2233  0.0  0.0 229456  4968 ?        Ss   11:24   0:00 php-fpm: master process (/home/admin/app/php/etc/php-fpm.conf)

[admin@spk php]$ sudo pmap 2233
2233:   php-fpm: master process (/home/admin/app/php/etc/php-fpm.conf)
0000000000400000  10396K r-x-- php-fpm
0000000001026000    708K r---- php-fpm
00000000010d7000     60K rw--- php-fpm
00000000010e6000    144K rw---   [ anon ]
00000000015bc000   2380K rw---   [ anon ]
00007fc8025d4000     48K r-x-- libnss_files-2.17.so
00007fc8025e0000   2044K ----- libnss_files-2.17.so
00007fc8027df000      4K r---- libnss_files-2.17.so
00007fc8027e0000      4K rw--- libnss_files-2.17.so
00007fc8027e1000     24K rw---   [ anon ]
00007fc8027e7000     48K r-x-- seaslog.so
00007fc8027f3000   2044K ----- seaslog.so
00007fc8029f2000      8K r---- seaslog.so
00007fc8029f4000      4K rw--- seaslog.so
00007fc8029f5000     96K r-x-- memcache.so
00007fc802a0d000   2048K ----- memcache.so
00007fc802c0d000      4K r---- memcache.so
00007fc802c0e000      4K rw--- memcache.so
......

3、参考

How to check what libraries are used by a program or process on Linux:

http://ask.xmodulo.com/check-library-dependency-program-process-linux.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值