AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 687799
Accepted
Vishal Sharma
Vishal Sharma
Asked: 2022-01-25 21:30:36 +0800 CST2022-01-25 21:30:36 +0800 CST 2022-01-25 21:30:36 +0800 CST

从给定的共享库中找出代码中使用的函数/变量

  • 772

我正在分析 linux 平台(redhat)上的一个大型 C++ 项目,特别是其中使用的共享库。如何从特定的共享库中找到该项目中使用了哪些符号(函数/变量)?

首先,我在我的二进制文件上运行了以下命令:

readelf -d binaryName | grep -i "Shared library"

我得到了在我的项目中使用的共享库列表(ldd 显示更长的列表,因为这些共享库也有自己的依赖项)例如

 0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libuv.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libssl.so.1.1]
 0x0000000000000001 (NEEDED)             Shared library: [libcrypto.so.1.1]
 0x0000000000000001 (NEEDED)             Shared library: [libz.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

现在有一种方法可以找出libuv.so.1项目代码库中使用了哪些符号。任何人都可以提出一些路线图吗?

linux c++
  • 2 2 个回答
  • 732 Views

2 个回答

  • Voted
  1. Best Answer
    Stephen Kitt
    2022-01-25T22:00:40+08:002022-01-25T22:00:40+08:00
    nm -uD /path/to/your/binary
    

    将列出二进制文件中所有未定义的动态符号。然后,您需要将其与输出相匹配

    nm -gD /path/to/a/library
    

    对于您的命令列出的每个库,readelf以确定哪个库提供每个符号。

    请注意,这不一定给出完整的图片;libdl特别是,不会考虑通过访问的库和符号。如果您愿意运行二进制文件,并且它使用 GNU C 库的动态加载程序(ld.so或者更确切地说是在 Linux 上),您可以通过在其环境中运行带有 setld-linux.so的二进制文件来详细列出所有符号绑定。LD_DEBUG=bindings详情请参阅man ld.so。

    • 2
  2. Vishal Sharma
    2022-01-26T05:07:59+08:002022-01-26T05:07:59+08:00

    使用接受的答案和此处提供的信息,我创建了以下脚本,用于查找当前在二进制文件中使用的所有符号(取自共享库)。该脚本采用 1 个参数,即二进制文件的名称(如果二进制文件位于与脚本不同的目录中,则需要路径)。

    该脚本将显示输入中给出的二进制文件所需的共享库。所有的符号将被转储到一个输出文件(result.txt)

    #!/bin/bash
    
    if [ "$#" -ne 1 ]
    then
        echo "1 argument needed in the script"
        echo "e.g. $0 [binary name(complete path)]"
        exit
    fi
    
    if [ -f $1 ]
    then
        echo "Going to find the unresolved symbols found in \"$1\""
    else
        echo "Binary file \"$1\" not found. Check name/path."
    fi
    
    binaryFile=$1
    
    lddOutput=(`ldd $binaryFile | awk '{print $3}' | grep -v "0x" | awk 'NF >0'`)
    
    #echo "$lddOutput"
    
    sharedDependencies=()
    
    echo "Given below are the shared libraries used in $1"
    for lib in "${lddOutput[@]}"
    do
        sharedDependencies+=($lib)
        ls -lrta $lib
    done
    
    rm -f allSymbols.temp
    rm -f result.txt
    
    # Iterate the loop to read and print each array element
    #echo -e "\nGiven below are the dependencies found for $binaryFile\n"
    #echo "SharedDependencies: ${sharedDependencies}"
    for lib in "${sharedDependencies[@]}"
    do
    #echo "Will search below lib in sharedDependencies"
    #echo $lib
    #Create list of all text symbols from all the libraries
    #for symbol in `nm -gD $lib | awk '{$1=""}1' | grep " T \| W \| V \| w \| v \| t " | awk '{print $2}'`;
    #for symbol in `nm -gD $lib | grep -i " T \| W \| V "`;
    nm -gD $lib | grep -i " T \| W \| V \| I " | while read symbol;
    do
    string=
    sym=
    #echo -e "\nsymbol->$symbol" >> debug.txt
    n=`echo $symbol | awk "{print NF}"`
    #echo -e "n->$n\n" >> debug.txt
    if [ $n -eq 2 ]
    then
    sym=`echo $symbol | awk '{print $2}'`
    else
    sym=`echo $symbol | awk '{print $3}'`
    fi
    
    string="$lib contains $sym"
    echo $string >> allSymbols.temp
    #echo $string >> debug.txt
    done
    done
    
    undefinedDynamicSymbols=`nm -uD $binaryFile | awk '{print $2}'`
    #echo -e "\n\nUndefinedDynamicSymbols\n$undefinedDynamicSymbols\n"
    
    for undefinedSymbol in $undefinedDynamicSymbols;
    do
    echo $undefinedSymbol >> result.txt
    grep  -w $undefinedSymbol allSymbols.temp >> result.txt
    echo -e "\n" >> result.txt
    done
    
    echo "symbols dumped in result.txt"
    
    rm -f allSymbols.temp
    
    • 0

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve