我正在编写一个 shell 脚本,需要识别哪个共享库(
.so
文件)包含特定函数。该脚本应该能够在标准库目录(例如 /usr/lib
)以及添加到 LD_LIBRARY_PATH
环境变量的自定义目录中进行搜索。
是否有一个工具或工具组合可以帮助我实现这一目标?理想情况下,我想要一个可以在 shell 脚本中实现的解决方案,而不需要编译额外的程序。任何指导或示例将不胜感激!
这是我的目标:
我编写了一个 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
之后使用,因此性能应该是合理的,但这也取决于库的数量和正在搜索的目录的大小。
请注意,此脚本可能需要一些时间才能执行,因为它会搜索所有指定的目录及其子目录以查找共享库。此外,确保您对正在搜索的目录具有读取权限也很重要。
请注意,我已将当前目录(“.”)添加到搜索目录列表中,这意味着脚本还将检查运行脚本的目录中的共享库。