要列出共享库中的所有方法,我使用
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.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 -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/