列出共享库中的所有方法我使用
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 时,就像这样
find ./lib -name "*.so" | objdump -T
我收到此错误:
objdump: 'a.out': No such file
这个 lib 文件夹确实包含很多共享库文件。
我的命令出了什么问题?
SK
答案 0 :(得分:2)
find ./lib -name "*.so" | xargs objdump -T
或
find ./lib -name "*.so" -exec objdump -T {} +
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
。< / p>
有些命令一次不接受多个文件名,而只需要使用一个文件名参数多次调用。为此,请将-n1
传递给xargs
,例如find ./lib -name "*.so" | xargs -n1 objdump -T
。使用上面的示例文件,xargs
将运行objdump -T libone.so
,然后objdump -T libtwo.so
,然后objdump -T libthree.so
。 (虽然objdump
确实接受多个文件名参数,但在这种情况下没有必要,除非lib
文件夹包含那么多你担心超出最大命令行长度的文件。)
find -exec
find
有自己的选项来运行命令并传递它作为命令行参数找到的文件名。 -exec
选项接受命令,并使用找到的文件名或文件名替换字符串{}
,+
表示要运行的命令的结束。
如果您想只使用一个文件名多次运行该命令,例如xargs -n1
,请在命令\;
中使用+
而不是find ./lib -name "*.so" -exec objdump -T {} \;
。< / p>
答案 1 :(得分:0)
使用xargs
或-exec
。另外,如果您对nm
提供的额外信息不感兴趣,objdump
而不是objdump
会稍快一些。
find /lib -name \*.so -print0 |xargs -0 nm -D
find /lib -name \*.so -exec nm -D {} +