从共享库转储方法

时间:2016-12-14 16:41:03

标签: 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 时,就像这样

find ./lib -name "*.so" | objdump -T

我收到此错误:

objdump: 'a.out': No such file

这个 lib 文件夹确实包含很多共享库文件。

我的命令出了什么问题?

SK

2 个答案:

答案 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.solibtwo.solibthree.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 {} +