0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取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命令可以列出一个程序依赖的需要动态链接的库函数,譬如:

用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
    +关注

    关注

    87

    文章

    11191

    浏览量

    208623
  • python
    +关注

    关注

    54

    文章

    4763

    浏览量

    84338

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

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

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

    Python 的项目中,如何管理所用的全部依赖呢?最主流的做法是维护份requirements.txt,记录下依赖
    发表于 11-21 11:16 1376次阅读
    <b class='flag-5'>Python</b>如何管理所用的全部<b class='flag-5'>依赖</b><b class='flag-5'>库</b>

    10杀手级的Python自动化脚本

    今天浩道跟大家分享10日常工作中用到的python自动化脚本。让你感受python简单强大之处!
    发表于 11-28 11:07 662次阅读

    13用于日常编程的高级Python脚本

    今天浩道跟大家分享13用于日常编程的高级python脚本。让你不会写脚本的也能感受到其魅力!
    发表于 12-09 11:47 603次阅读

    查询Linux应用程序运行依赖哪些的方法

    查询Linux应用程序运行依赖哪些 法: $(CROSS_COMPILE)ldd AppName 如: arm_v5t_le-lld
    发表于 08-19 07:42

    Python应用与优化所必备的6基本

    无论你是想快速入手Python还是想为Python应用程序构建本地UI,亦或者对Python代码进行优化,本文列举的6
    发表于 11-15 11:40 2708次阅读

    常用Python有那些38常用Python的详细概述

    Python作为设计优秀的程序语言,现在已广泛应用于各种领域,依靠其强大的第三方类Python
    的头像 发表于 11-03 10:28 3.1w次阅读

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

    1.命令简介 ldd 命令用于打印程序或者共享文件所依赖的共享列表。注意,ldd 本身不是
    的头像 发表于 02-02 11:37 2013次阅读

    ADM1266 Linux API和Python简介

    ADM1266 Linux API和Python简介
    发表于 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
    发表于 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行代码,没有外部依赖
    的头像 发表于 02-24 10:32 773次阅读

    如何在Linux命令行中运行Python脚本

    Python种高级编程语言,被广泛应用于数据科学、机器学习、Web 开发等领域。在 Linux 操作系统中,Python
    的头像 发表于 05-12 14:49 1635次阅读

    如何查看linux程序共享呢?

    linux系统中,程序通常需要依赖于外部来正常工作。这些可以直接编译到程序中,也可以从共享
    的头像 发表于 08-28 09:11 1492次阅读
    如何查看<b class='flag-5'>linux</b><b class='flag-5'>程序</b>共享<b class='flag-5'>库</b>呢?

    SQLite数据python的区别

    SQLite数据python的区别 SQLite是种轻量级关系型数据管理系统,是嵌入
    的头像 发表于 08-28 16:41 795次阅读

    TinyDB :Python编写的轻量级数据

    TinyDB 是Python 编写的轻量级数据共只有1800行代码,没有外部依赖
    的头像 发表于 10-21 10:22 879次阅读

    如何使用linux下gdb来调试python程序

    如何使用linux下gdb来调试python程序  在Linux下,可以使用GDB(GNU调试器)来调试Python
    的头像 发表于 01-31 10:41 2323次阅读