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

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公司

最佳答案

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.soxargs将运行命令objdump -T libone.so libtwo.so libthree.so
有些命令一次不接受多个文件名,必须用一个文件名参数多次调用。为此,请将-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一样,请在命令中使用\;而不是+

关于linux - 共享库中的转储方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41147752/

10-11 20:37