在下今天写了一个小小的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
+关注
关注
87文章
11354浏览量
210657 -
python
+关注
关注
56文章
4811浏览量
85102
原文标题:宋宝华:一个简单的python脚本看透Linux程序对库的依赖
文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
Python如何管理所用的全部依赖库
![<b class='flag-5'>Python</b>如何管理所用的全部<b class='flag-5'>依赖</b><b class='flag-5'>库</b>](https://file.elecfans.com/web1/M00/C7/DC/o4YBAF9t-IOARcOPAABZ1s_gUJw078.jpg)
查询Linux应用程序运行依赖哪些库的方法
Python应用与优化所必备的6个基本库
常用Python库有那些38个常用Python库的详细概述
ldd命令:用于打印程序或者共享库文件所依赖的共享库列表
python程序在嵌入式linux系统运行。。
![<b class='flag-5'>python</b><b class='flag-5'>程序</b>在嵌入式<b class='flag-5'>linux</b>系统运行。。](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
评论