一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一個(gè)python腳本看透Linux程序?qū)?kù)的依賴(lài)

Linux閱碼場(chǎng) ? 來(lái)源:cg ? 2018-12-24 13:44 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在下今天寫(xiě)了一個(gè)小小的python程序,可以在完全不看源代碼的情況下,分析a如果調(diào)用b.so的時(shí)候,會(huì)引用b.so的哪些函數(shù),它的用法如下:

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

把a(bǔ)作為-s參數(shù),把b.so作為-d參數(shù)。

它的原理如下:

用nm -D --undefined-only命令可以列出一個(gè)程序依賴(lài)的需要?jiǎng)討B(tài)鏈接的庫(kù)函數(shù),譬如:

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

我們只要把a(bǔ)依賴(lài)的函數(shù),與b.so供給的函數(shù)中,求一個(gè)交集,即可在完全沒(méi)有源代碼的情況下,知道a會(huì)call到b.so的哪些函數(shù)。核心源代碼如下(部分用了省略號(hào)方便閱讀):

#!/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對(duì)應(yīng)的源代碼如下:

so easy。

希望你能夠喜歡這個(gè)小工具。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11511

    瀏覽量

    213845
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4827

    瀏覽量

    86776

原文標(biāo)題:宋寶華:一個(gè)簡(jiǎn)單的python腳本看透Linux程序?qū)?kù)的依賴(lài)

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Python如何管理所用的全部依賴(lài)庫(kù)

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

    10個(gè)殺手級(jí)的Python自動(dòng)化腳本

    今天浩道跟大家分享10個(gè)日常工作中用到的python自動(dòng)化腳本。讓你感受python簡(jiǎn)單強(qiáng)大之處!
    發(fā)表于 11-28 11:07 ?836次閱讀

    13個(gè)用于日常編程的高級(jí)Python腳本

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

    查詢(xún)Linux應(yīng)用程序運(yùn)行依賴(lài)哪些庫(kù)的方法

    查詢(xún)Linux應(yīng)用程序運(yùn)行依賴(lài)哪些庫(kù) 法: $(CROSS_COMPILE)ldd AppName 如: arm_v5t_le-lld
    發(fā)表于 08-19 07:42

    常用Python庫(kù)有那些38個(gè)常用Python庫(kù)的詳細(xì)概述

    Python作為個(gè)設(shè)計(jì)優(yōu)秀的程序語(yǔ)言,現(xiàn)在已廣泛應(yīng)用于各種領(lǐng)域,依靠其強(qiáng)大的第三方類(lèi)庫(kù),Python
    的頭像 發(fā)表于 11-03 10:28 ?3.2w次閱讀

    ldd命令:用于打印程序或者共享庫(kù)文件所依賴(lài)的共享庫(kù)列表

    1.命令簡(jiǎn)介 ldd 命令用于打印程序或者共享庫(kù)文件所依賴(lài)的共享庫(kù)列表。注意,ldd 本身不是個(gè)
    的頭像 發(fā)表于 02-02 11:37 ?2390次閱讀

    ADM1266 Linux API和Python庫(kù)簡(jiǎn)介

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

    python程序在嵌入式linux系統(tǒng)運(yùn)行。。

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

    個(gè)Python編寫(xiě)的輕量級(jí)數(shù)據(jù)庫(kù)

    TinyDB 是個(gè)Python 編寫(xiě)的輕量級(jí)數(shù)據(jù)庫(kù),共只有1800行代碼,沒(méi)有外部依賴(lài)項(xiàng)
    的頭像 發(fā)表于 02-24 10:32 ?1246次閱讀

    如何在Linux命令行中運(yùn)行Python腳本

    Python種高級(jí)編程語(yǔ)言,被廣泛應(yīng)用于數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)、Web 開(kāi)發(fā)等領(lǐng)域。在 Linux 操作系統(tǒng)中,Python
    的頭像 發(fā)表于 05-12 14:49 ?2128次閱讀

    如何查看linux程序共享庫(kù)呢?

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

    SQLite數(shù)據(jù)庫(kù)python的區(qū)別

    SQLite數(shù)據(jù)庫(kù)python的區(qū)別 SQLite是種輕量級(jí)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),是個(gè)嵌入
    的頭像 發(fā)表于 08-28 16:41 ?1172次閱讀

    TinyDB :個(gè)Python編寫(xiě)的輕量級(jí)數(shù)據(jù)庫(kù)

    TinyDB 是個(gè)Python 編寫(xiě)的輕量級(jí)數(shù)據(jù)庫(kù),共只有1800行代碼,沒(méi)有外部依賴(lài)項(xiàng)
    的頭像 發(fā)表于 10-21 10:22 ?1396次閱讀

    如何使用linux下gdb來(lái)調(diào)試python程序

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

    零基礎(chǔ)入門(mén):如何在樹(shù)莓派上編寫(xiě)和運(yùn)行Python程序

    種非常有用的編程語(yǔ)言,其語(yǔ)法易于閱讀,允許程序員使用比匯編、C或Java等語(yǔ)言更少的代碼行。Python編程語(yǔ)言最初實(shí)際上是作為Linux腳本
    的頭像 發(fā)表于 03-25 09:27 ?757次閱讀
    零基礎(chǔ)入門(mén):如何在樹(shù)莓派上編寫(xiě)和運(yùn)行<b class='flag-5'>Python</b><b class='flag-5'>程序</b>?