在指定目录下查找所有依赖于指定库的可执行文件
Find all executable files that depend on the specified library in the specified directory
我的目标是编写一个 shell 脚本,使用“objdump -p”命令在指定目录中查找依赖于指定库的所有可执行文件。 (OpenBSD)。
我尝试这样的事情:
find -perm -111 -print0 | xargs -r0 objdump -p | grep -l "NEEDED "
但此解决方案不起作用,因为 grep 无法找出它在其中找到给定匹配项的文件名。难点在于确定 grep 在其中找到指定库的可执行文件的名称。
任何人都可以使用“objdump -p”命令提出解决方案吗?
诀窍是执行 shell 脚本而不是单个命令,以便能够重新使用文件名。
finddepend() {
# Arg 1: The directory where to find
# Arg 2: The library name
basedir=
libname=
find "$basedir" \
\( -perm -100 -o -perm -010 -o -perm -001 \) \
\( -type f -o -type l \) \
-exec sh -c '
# Arg 0: Is a dummy _ for this inline script
# Arg 1: The executable file path
# Arg 2: The library name
filepath=
libname=
objdump -p "$filepath" 2>/dev/null |
if grep -qF " NEEDED $libname"; then
printf %s\n "${filepath##*/}"
fi
' _ {} "$libname" \;
}
用法示例:
finddepend /bin libselinux.so
mv
systemctl
tar
sed
udevadm
ls
mknod
systemd
mkdir
ss
dir
vdir
cp
systemd-hwdb
netstat
既然可以使用 ldd
(列出动态依赖项),为什么要使用 objdump
? objdump
给出了一个完整的摘要,您需要对其进行处理才能获得您正在寻找的信息,而 ldd
只为您提供该信息。
我的目标是编写一个 shell 脚本,使用“objdump -p”命令在指定目录中查找依赖于指定库的所有可执行文件。 (OpenBSD)。 我尝试这样的事情:
find -perm -111 -print0 | xargs -r0 objdump -p | grep -l "NEEDED "
但此解决方案不起作用,因为 grep 无法找出它在其中找到给定匹配项的文件名。难点在于确定 grep 在其中找到指定库的可执行文件的名称。 任何人都可以使用“objdump -p”命令提出解决方案吗?
诀窍是执行 shell 脚本而不是单个命令,以便能够重新使用文件名。
finddepend() {
# Arg 1: The directory where to find
# Arg 2: The library name
basedir=
libname=
find "$basedir" \
\( -perm -100 -o -perm -010 -o -perm -001 \) \
\( -type f -o -type l \) \
-exec sh -c '
# Arg 0: Is a dummy _ for this inline script
# Arg 1: The executable file path
# Arg 2: The library name
filepath=
libname=
objdump -p "$filepath" 2>/dev/null |
if grep -qF " NEEDED $libname"; then
printf %s\n "${filepath##*/}"
fi
' _ {} "$libname" \;
}
用法示例:
finddepend /bin libselinux.so
mv
systemctl
tar
sed
udevadm
ls
mknod
systemd
mkdir
ss
dir
vdir
cp
systemd-hwdb
netstat
既然可以使用 ldd
(列出动态依赖项),为什么要使用 objdump
? objdump
给出了一个完整的摘要,您需要对其进行处理才能获得您正在寻找的信息,而 ldd
只为您提供该信息。