宋宝华:一个简单的python脚本看透Linux程序对库的依赖
点击蓝字
关注我们
在下今天写了一个小小的python程序,可以在完全不看源代码的情况下,分析a如果调用b.so的时候,会引用b.so的哪些函数,它的用法如下:
./symbol-dep.py -s a -d b.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。
希望你能够喜欢这个小工具。
(欢迎支持原创^-^)
查看我们精华技术文章请移步: