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 {} +