在下今天寫了一個小小的python程序,可以在完全不看源代碼的情況下,分析a如果調(diào)用b.so的時候,會引用b.so的哪些函數(shù),它的用法如下:
./symbol-dep.py-sa-db.so
把a(bǔ)作為-s參數(shù),把b.so作為-d參數(shù)。
它的原理如下:
用nm -D --undefined-only命令可以列出一個程序依賴的需要動態(tài)鏈接的庫函數(shù),譬如:
用nm -D --defined-only命令可以列出一個動態(tài)鏈接庫給別人提供的函數(shù),譬如:
我們只要把a(bǔ)依賴的函數(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:])
完整源代碼高亮后如下:
運(yùn)行結(jié)果如下:
范例中a.out對應(yīng)的源代碼如下:
so easy。
希望你能夠喜歡這個小工具。
-
Linux
+關(guān)注
關(guān)注
87文章
11345瀏覽量
210400 -
python
+關(guān)注
關(guān)注
56文章
4807瀏覽量
85040
原文標(biāo)題:宋寶華:一個簡單的python腳本看透Linux程序?qū)斓囊蕾?/p>
文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
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)
10個殺手級的Python自動化腳本
查詢Linux應(yīng)用程序運(yùn)行依賴哪些庫的方法
常用Python庫有那些38個常用Python庫的詳細(xì)概述
ldd命令:用于打印程序或者共享庫文件所依賴的共享庫列表
python程序在嵌入式linux系統(tǒng)運(yùn)行。。
![<b class='flag-5'>python</b><b class='flag-5'>程序</b>在嵌入式<b class='flag-5'>linux</b>系統(tǒng)運(yùn)行。。](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論