Linux 从共享库转储方法

Linux 从共享库转储方法,linux,shell,pipe,Linux,Shell,Pipe,要列出共享库中的所有方法,我使用 objdump -T shared_library.so 什么有这样的输出: 00013318 g DF .text 00000020 Base apr_os_dir_get 0001afc0 g DF .text 000000f8 Base apr_socket_send 00020808 g DF .text 00000004 Base apr_shm_create_ex 但是当我尝

要列出共享库中的所有方法,我使用

objdump -T shared_library.so
什么有这样的输出:

00013318 g    DF .text  00000020  Base        apr_os_dir_get
0001afc0 g    DF .text  000000f8  Base        apr_socket_send
00020808 g    DF .text  00000004  Base        apr_shm_create_ex
但是当我尝试将find的输出导入objdump时,就像这样

find ./lib -name "*.so" | objdump -T
我得到这个错误:

objdump: 'a.out': No such file
这个lib文件夹确实包含很多共享库文件

我的命令怎么了

SK

objdump
要求在命令行上传递库的名称。但是,通过管道将
find
的输出发送到它将文件名发送到
objdump
的标准输入,它将忽略该输入。如果在命令行中没有为
objdump
指定文件名,则默认情况下会查找名为
a.out
,这是某些编译器和链接器的默认输出文件名

有几种方法可以将
find
找到的文件用作
objdump
的参数

xargs
xargs
读取标准输入,然后运行另一个命令,将从标准输入读取的内容作为该命令的参数。在这种情况下,
find
输出中的文件名将通过管道传输到
xargs
,这将把它们连接成一行,从自己的命令行将其附加到命令参数,然后运行该命令。例如,如果
lib
文件夹包含三个文件
libone.so
libtwo.so
、和
libthree.so
xargs
将运行命令
objdump-T libone.so libtwo.so libthree.so

有些命令一次不接受多个文件名,必须用一个文件名参数多次调用。要执行此操作,请将
-n1
传递到
xargs
,例如
find./lib-name“*.so”| xargs-n1 objdump-T
。对于上面的示例文件,
xargs
将运行
objdump-tlibone.so
,然后运行
objdump-tlibtwo.so
,然后运行
objdump-tlibthree.so
。(虽然
objdump
确实接受多个文件名参数,因此在这种情况下不需要它,除非
lib
文件夹包含的文件太多,您担心超过最大命令行长度。)

find-exec
find
有自己的选项来运行命令并将找到的文件名作为命令行参数传递。
-exec
选项接受命令,并将字符串
{}
替换为找到的文件名或文件名,
+
表示要运行的命令结束


如果只想使用一个文件名多次运行该命令,如
xargs-n1
does,请使用
\而不是命令中的
+
find./lib-name“*.so”-exec objdump-T{}

使用
xargs
-exec
。另外,如果您对
objdump
提供的额外信息不感兴趣,则使用
nm
代替
objdump
会稍微快一点

find /lib -name \*.so -print0 |xargs -0 nm -D
find /lib -name \*.so -exec nm -D {} +

最简单的:
objdump-tlib/*.so
?@Robᵩ 无法递归查找文件。清除!我明白了,我很感激。这个解释应该是手册的一部分:-)我也尝试过这些命令,我发现它们也很有用。谢谢。您不需要
/lib
中的
/
。当运行位于当前目录中的二进制文件时(例如,如果
objdump
位于当前目录中:
/objdump-T shared_library.so
),只需包含
/
),而不包括命令的任何参数。在本例中,您可以简单地说
find lib-name“*.so”…
find ./lib -name "*.so" -exec objdump -T {} +
find /lib -name \*.so -print0 |xargs -0 nm -D
find /lib -name \*.so -exec nm -D {} +