如何在Shell脚本中查找哪个共享库包含特定函数?

问题描述 投票:0回答:1

我正在编写一个 shell 脚本,需要识别哪个共享库(

.so
文件)包含特定函数。该脚本应该能够在标准库目录(例如
/usr/lib
)以及添加到
LD_LIBRARY_PATH
环境变量的自定义目录中进行搜索。

是否有一个工具或工具组合可以帮助我实现这一目标?理想情况下,我想要一个可以在 shell 脚本中实现的解决方案,而不需要编译额外的程序。任何指导或示例将不胜感激!

这是我的目标:

  1. 脚本应采用函数名称作为输入。
  2. 然后它应该找到包含此函数的任何共享库文件。
  3. 它应该适用于标准系统路径和 LD_LIBRARY_PATH 中包含的路径。
bash shell shared-libraries
1个回答
0
投票

我编写了一个 shell 脚本,它应该可以帮助您实现查找哪个共享库包含特定函数的目标。该脚本利用

nm
命令列出库中的符号,并搜索
LD_LIBRARY_PATH
中指定的目录以及标准库路径。

这是脚本:

#!/bin/bash

# Check if the function name was provided
if [ "$#" -ne 1 ]; then
    echo "Usage: $0 <function_name>"
    exit 1
fi

function_name=$1

# Start with known common library paths
library_paths=("/lib" "/usr/lib" "/lib64" "/usr/lib64" "/usr/local/lib" "/usr/local/lib64" ".")

# Include paths from ld.so.conf
if [ -f "/etc/ld.so.conf" ]; then
    # Read the contents of ld.so.conf and include files from ld.so.conf.d
    ld_so_paths=$(cat /etc/ld.so.conf; find /etc/ld.so.conf.d/ -type f -exec cat {} +)
    for path in $ld_so_paths; do
        if [[ "$path" =~ ^/.* ]]; then
            library_paths+=("$path")
        fi
    done
fi

# Include paths from LD_LIBRARY_PATH if it is set
if [ -n "$LD_LIBRARY_PATH" ]; then
    IFS=':' read -ra ld_library_paths <<< "$LD_LIBRARY_PATH"
    library_paths+=("${ld_library_paths[@]}")
fi

# Remove duplicate paths
library_paths=($(printf "%s\n" "${library_paths[@]}" | sort -u))

# Check if nm is available
if ! command -v nm > /dev/null; then
    echo "Error: 'nm' command not found. Please install binutils."
    exit 1
fi

# Search for the function in each path
for path in "${library_paths[@]}"; do
    if [ -d "$path" ]; then
        # Find shared libraries and apply nm
        find "$path" -type f -name "*.so*" -exec sh -c "nm -D {}  2>/dev/null | grep -i '$function_name' && echo {}" \;
    fi
done

确保从可用

nm
的终端运行此脚本,并且您具有访问库目录的必要权限。该脚本将输出包含指定函数的库的路径。由于
grep
仅在
nm
之后使用,因此性能应该是合理的,但这也取决于库的数量和正在搜索的目录的大小。

请注意,此脚本可能需要一些时间才能执行,因为它会搜索所有指定的目录及其子目录以查找共享库。此外,确保您对正在搜索的目录具有读取权限也很重要。

请注意,我已将当前目录(“.”)添加到搜索目录列表中,这意味着脚本还将检查运行脚本的目录中的共享库。

© www.soinside.com 2019 - 2024. All rights reserved.