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

    文章

    10991

    浏览量

    206742
  • python
    +关注

    关注

    51

    文章

    4677

    浏览量

    83473

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

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

收藏 人收藏

    评论

    相关推荐

    基于Python脚本的R语言的函数

    本文介绍了采用创建一个Python脚本,用该脚本模仿R风格的函数的方法来方便地进行统计。 是用R语言还是用Python语言?这是一个旷日持久的争论。在此,我们可以尝试采用折中路线:创建
    的头像 发表于 10-12 09:33 1862次阅读
    基于<b class='flag-5'>Python</b><b class='flag-5'>脚本</b>的R语言的函数

    Python与C#对比

    Python种跨平台语言。无论是在Windows、Linux、Unix还是Mac Os系统,我们都可以使用Python。甚至在Linux
    发表于 05-14 17:14

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

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

    python自动编写脚本及分配引脚

    对于具有484引脚的芯片,如果手动一个一个设置引脚,必然是场噩梦。网上有使用Capture进行自动导入的帖子,不过没有找到AD方面的帖子。本文使用python,编写
    发表于 07-23 06:49

    Python操作Mysql实现数据脚本的方法概述

    Python操作Mysql数据脚本(cmd)
    发表于 10-08 10:44

    如何在 Linux 上安装 Python

    会有 .tar.xz 归档文件(“tarball”),其中包含 Python 的源代码。 步骤 3:解压 tarball下载完成后,使用解压程序
    发表于 05-14 14:13

    自定义Python PyPI存储

      Python默认从PyPI存储下载其依赖项。它包含最新版本(稳定或不稳定)和各种数量的软件包。那么定制私有软件包存储的需求是什么?想要知道这个问题的答案,首先来说
    发表于 09-14 15:59

    在windows下安装pythonlinux下安装python 在masOS下安装python

    选择自定义的安装路径并保证路径中没有中文。安装完成会看到“Setup was successful”的提示。如果稍后运行Python程序时,出现因为缺失些动态链接文件而导致
    发表于 06-11 16:59

    怎样去谢在嵌入式linux系统下的python程序

    最近在写运行在嵌入式linux系统下的python程序。中间遇到很多坑,接下来我就一一说下。从windows编写python
    发表于 11-04 07:21

    应用程序依赖的动态和静态没有调试信息的原因

    的原因可能有这么几个:应用程序在编译时没有指定-g选项,导致可执行程序没有调试信息。应用程序依赖的动态和静态
    发表于 11-05 06:41

    如何在 IIS 中执行 Python 脚本

    如何在 IIS 中执行 Python 脚本 Python 是一种解释脚本语言,概念类似 Microsoft Visual Basic Scripting Edition (VBSc
    发表于 02-23 15:13 1144次阅读

    Linux脚本教程

    Linux脚本教程
    发表于 10-30 15:48 12次下载
    <b class='flag-5'>Linux</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>系统运行。。

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

    Python 脚本。 在本文中,我们将详细介绍如何在 Linux 命令行中运行 Python 脚本。我们将讨论以下主题:
    的头像 发表于 05-12 14:49 1373次阅读

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

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