宋宝华:一个简单的python脚本看透Linux程序对库的依赖

来自:Linux阅码场(微信号:LinuxDev),作者:宋宝华

在下今天写了一个小小的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。


希望你能够喜欢这个小工具。

推荐↓↓↓
Linux学习
上一篇:Linux内核内存管理算法Buddy和Slab 下一篇:宋宝华:一个简单的Python脚本画出Linux程序/库依赖图