在下今天写了一个小小的python程序,可以在完全不看源代码的情况下,分析a如果调用b.so的时候,会引用b.so的哪些函数,它的用法如下:
./symbol-dep.py-sa-db.so
把a作为-s参数,把b.so作为-d参数。
它的原理如下:
用nm -D --undefined-only命令可以列出一个程序依赖的需要动态链接的库函数,譬如:

用nm -D --defined-only命令可以列出一个动态链接库给别人提供的函数,譬如:

我们只要把a依赖的函数,与b.so供给的函数中,求一个交集,即可在完全没有源代码的情况下,知道a会call到b.so的哪些函数。核心源代码如下(部分用了省略号方便阅读):
#!/usr/bin/python3
import sys, getopt, os
def main(argv):
...
try:
opts, args = getopt.getopt(...)
except getopt.GetoptError:
...
for opt, arg in opts:
if opt == '-h':
p...
elif opt in ("-s", "--sfile"):
srcfile = arg
elif opt in ("-d", "--dfile"):
dstfile = arg
# get the symbols srcfile depends on
src=os.popen("nm -D --undefined-only "+srcfile)
srclist=src.read().splitlines()
for sline in srclist:
neededsymbols.append(sline.split()[-1])
# get the symbols dstfile exports
dst=os.popen("nm -D --defined-only "+dstfile)
dstlist=dst.read().splitlines()
for dline in dstlist:
exportedsymbols.append(dline.split()[-1])
# intersection of src and dest
for symbol in neededsymbols:
if symbol in exportedsymbols:
print(symbol)
if __name__ == "__main__":
main(sys.argv[1:])
完整源代码高亮后如下:


运行结果如下:

范例中a.out对应的源代码如下:

so easy。
希望你能够喜欢这个小工具。
-
Linux
+关注
关注
88文章
11628浏览量
217985 -
python
+关注
关注
57文章
4858浏览量
89588
原文标题:宋宝华:一个简单的python脚本看透Linux程序对库的依赖
文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
Python如何管理所用的全部依赖库
查询Linux应用程序运行依赖哪些库的方法
常用Python库有那些38个常用Python库的详细概述
ldd命令:用于打印程序或者共享库文件所依赖的共享库列表
python程序在嵌入式linux系统运行。。
如何在Linux命令行中运行Python脚本
TinyDB :一个纯Python编写的轻量级数据库
如何使用linux下gdb来调试python程序
零基础入门:如何在树莓派上编写和运行Python程序?

一个python脚本看透Linux程序对库的依赖
评论