在下今天寫了一個小小的python程序,可以在完全不看源代碼的情況下,分析a如果調(diào)用b.so的時候,會引用b.so的哪些函數(shù),它的用法如下:
./symbol-dep.py-sa-db.so
把a作為-s參數(shù),把b.so作為-d參數(shù)。
它的原理如下:
用nm -D --undefined-only命令可以列出一個程序依賴的需要動態(tài)鏈接的庫函數(shù),譬如:
用nm -D --defined-only命令可以列出一個動態(tài)鏈接庫給別人提供的函數(shù),譬如:
我們只要把a依賴的函數(shù),與b.so供給的函數(shù)中,求一個交集,即可在完全沒有源代碼的情況下,知道a會call到b.so的哪些函數(shù)。核心源代碼如下(部分用了省略號方便閱讀):
#!/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:])
完整源代碼高亮后如下:
運行結(jié)果如下:
范例中a.out對應(yīng)的源代碼如下:
so easy。
希望你能夠喜歡這個小工具。
-
Linux
+關(guān)注
關(guān)注
87文章
11304瀏覽量
209503 -
python
+關(guān)注
關(guān)注
56文章
4797瀏覽量
84689
原文標(biāo)題:宋寶華:一個簡單的python腳本看透Linux程序?qū)斓囊蕾?/p>
文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論