如何在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
关键细节说明
- 路径去重:避免重复搜索同一目录,提升执行效率
- 动态符号检查:
nm -D仅查看动态导出的符号,符合共享库函数调用的实际场景 - 错误抑制:用
2>/dev/null屏蔽无权限读取或非有效共享库的报错信息 - LD_LIBRARY_PATH处理:仅添加存在的目录,避免无效路径干扰
内容的提问来源于stack exchange,提问作者zhexGG
相关产品推荐
相关产品推荐

