gpt4 book ai didi

linux - 从共享库转储方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:08:51 25 4
gpt4 key购买 nike

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

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文件夹确实包含很多共享库文件。

我的命令有什么问题?

科学

最佳答案

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,例如找到 ./lib -name "*.so"| xargs -n1 objdump -T。对于上面的示例文件,xargs 将运行 objdump -T libone.so,然后是 objdump -T libtwo.so,然后是 objdump -T libthree.so. (尽管 objdump 确实接受多个文件名参数,所以在这种情况下没有必要,除非 lib 文件夹包含太多文件以至于您担心超过最大命令行数长度。)

查找-exec

find 有自己的选项来运行命令并将找到的文件名作为命令行参数传递。 -exec 选项接受命令,并将字符串 {} 替换为找到的一个或多个文件名,+ 表示命令结束运行。

如果你想只用一个文件名多次运行命令,就像 xargs -n1 那样,使用 \; 而不是 + 在命令中:find ./lib -name "*.so"-exec objdump -T {}\;

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com