You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Shell脚本中查找包含指定函数的共享库

实现方法

可以直接用Linux系统自带的工具组合完成需求,无需编译额外程序,核心用到nm、ldconfig以及Shell内置功能:

核心工具说明

  • nm -D:查看共享库的动态符号表,快速定位是否包含目标函数
  • ldconfig -p:列出系统默认配置的共享库路径及文件,用于获取标准系统库目录
  • Shell字符串处理:解析LD_LIBRARY_PATH并合并搜索路径

脚本实现示例

#!/bin/bash

# 检查输入参数
if [ $# -ne 1 ]; then
    echo "用法: $0 <函数名>"
    exit 1
fi
TARGET_FUNC="$1"

# 收集所有要搜索的路径:系统默认路径 + LD_LIBRARY_PATH
SEARCH_PATHS=()
# 从ldconfig提取标准库路径并去重
while read -r line; do
    dir=$(dirname "$line")
    if [[ ! " ${SEARCH_PATHS[@]} " =~ " ${dir} " ]]; then
        SEARCH_PATHS+=("$dir")
    fi
done < <(ldconfig -p | awk '/^[[:space:]]/ {print $NF}')

# 添加LD_LIBRARY_PATH中的路径(如果存在)
if [ -n "$LD_LIBRARY_PATH" ]; then
    IFS=':' read -ra LDPATHS <<< "$LD_LIBRARY_PATH"
    for dir in "${LDPATHS[@]}"; do
        if [ -d "$dir" ] && [[ ! " ${SEARCH_PATHS[@]} " =~ " ${dir} " ]]; then
            SEARCH_PATHS+=("$dir")
        fi
    done
fi

# 遍历所有路径,搜索包含目标函数的.so文件
echo "正在搜索包含函数 ${TARGET_FUNC} 的共享库..."
for dir in "${SEARCH_PATHS[@]}"; do
    # 遍历目录下的.so文件(包括符号链接)
    find "$dir" -maxdepth 1 -type f -name "*.so*" 2>/dev/null | while read -r so_file; do
        # 检查符号表中是否存在目标函数(只看动态符号)
        nm -D "$so_file" 2>/dev/null | grep -q "T $TARGET_FUNC"
        if [ $? -eq 0 ]; then
            echo "找到: $so_file"
        fi
    done
done

关键细节说明

  1. 路径去重:避免重复搜索同一目录,提升执行效率
  2. 动态符号检查:nm -D仅查看动态导出的符号,符合共享库函数调用的实际场景
  3. 错误抑制:用2>/dev/null屏蔽无权限读取或非有效共享库的报错信息
  4. LD_LIBRARY_PATH处理:仅添加存在的目录,避免无效路径干扰

内容的提问来源于stack exchange,提问作者zhexGG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 16:01:01