0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一個python腳本看透Linux程序對庫的依賴

Linux閱碼場 ? 來源:cg ? 2018-12-24 13:44 ? 次閱讀

在下今天寫了一個小小的python程序,可以在完全不看源代碼的情況下,分析a如果調用b.so的時候,會引用b.so的哪些函數,它的用法如下:

./symbol-dep.py-sa-db.so

把a作為-s參數,把b.so作為-d參數。

它的原理如下:

用nm -D --undefined-only命令可以列出一個程序依賴的需要動態(tài)鏈接的庫函數,譬如:

用nm -D --defined-only命令可以列出一個動態(tài)鏈接庫給別人提供的函數,譬如:

我們只要把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。

希望你能夠喜歡這個小工具。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11304

    瀏覽量

    209475
  • python
    +關注

    關注

    56

    文章

    4797

    瀏覽量

    84682

原文標題:宋寶華:一個簡單的python腳本看透Linux程序對庫的依賴

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Python如何管理所用的全部依賴

    Python 的項目中,如何管理所用的全部依賴呢?最主流的做法是維護份requirements.txt,記錄下依賴
    發(fā)表于 11-21 11:16 ?1396次閱讀
    <b class='flag-5'>Python</b>如何管理所用的全部<b class='flag-5'>依賴</b><b class='flag-5'>庫</b>

    10殺手級的Python自動化腳本

    今天浩道跟大家分享10日常工作中用到的python自動化腳本。讓你感受python簡單強大之處!
    發(fā)表于 11-28 11:07 ?684次閱讀

    13用于日常編程的高級Python腳本

    今天浩道跟大家分享13用于日常編程的高級python腳本。讓你不會寫腳本的也能感受到其魅力!
    發(fā)表于 12-09 11:47 ?623次閱讀

    查詢Linux應用程序運行依賴哪些的方法

    查詢Linux應用程序運行依賴哪些 法: $(CROSS_COMPILE)ldd AppName 如: arm_v5t_le-lld
    發(fā)表于 08-19 07:42

    Python操作Mysql實現數據腳本的方法概述

    Python操作Mysql數據腳本(cmd)
    發(fā)表于 10-08 10:44

    常用Python有那些38常用Python的詳細概述

    Python作為設計優(yōu)秀的程序語言,現在已廣泛應用于各種領域,依靠其強大的第三方類Python
    的頭像 發(fā)表于 11-03 10:28 ?3.1w次閱讀

    ldd命令:用于打印程序或者共享文件所依賴的共享列表

    1.命令簡介 ldd 命令用于打印程序或者共享文件所依賴的共享列表。注意,ldd 本身不是
    的頭像 發(fā)表于 02-02 11:37 ?2075次閱讀

    ADM1266 Linux API和Python簡介

    ADM1266 Linux API和Python簡介
    發(fā)表于 05-17 10:50 ?6次下載
    ADM1266 <b class='flag-5'>Linux</b> API和<b class='flag-5'>Python</b><b class='flag-5'>庫</b>簡介

    python程序在嵌入式linux系統運行。。

    最近在寫運行在嵌入式linux系統下的python程序。中間遇到很多坑,接下來我就一一說下。從windows編寫python
    發(fā)表于 11-01 16:32 ?12次下載
    <b class='flag-5'>python</b><b class='flag-5'>程序</b>在嵌入式<b class='flag-5'>linux</b>系統運行。。

    Python編寫的輕量級數據

    TinyDB 是Python 編寫的輕量級數據,共只有1800行代碼,沒有外部依賴
    的頭像 發(fā)表于 02-24 10:32 ?831次閱讀

    如何在Linux命令行中運行Python腳本

    Python種高級編程語言,被廣泛應用于數據科學、機器學習、Web 開發(fā)等領域。在 Linux 操作系統中,Python
    的頭像 發(fā)表于 05-12 14:49 ?1686次閱讀

    如何查看linux程序共享呢?

    linux系統中,程序通常需要依賴于外部來正常工作。這些可以直接編譯到程序中,也可以從共享
    的頭像 發(fā)表于 08-28 09:11 ?1606次閱讀
    如何查看<b class='flag-5'>linux</b><b class='flag-5'>程序</b>共享<b class='flag-5'>庫</b>呢?

    SQLite數據python的區(qū)別

    SQLite數據python的區(qū)別 SQLite是種輕量級關系型數據管理系統,是嵌入
    的頭像 發(fā)表于 08-28 16:41 ?867次閱讀

    TinyDB :Python編寫的輕量級數據

    TinyDB 是Python 編寫的輕量級數據共只有1800行代碼,沒有外部依賴
    的頭像 發(fā)表于 10-21 10:22 ?999次閱讀

    如何使用linux下gdb來調試python程序

    如何使用linux下gdb來調試python程序? 在Linux下,可以使用GDB(GNU調試器)來調試Python
    的頭像 發(fā)表于 01-31 10:41 ?2619次閱讀