假设您使用包含多个工具和库的代码库,并且您希望在此类代码库中移植(或恢复)某些组件,但是有关符号在各个库中的位置的任何线索要么丢失,要么需要很长时间才能通过查看代码本身(是的,改进的文档可以避免此类问题,但要求很高)。发现在哪个库中可以找到代码中使用的符号的最快方法是什么?
原文由 a1an 发布,翻译遵循 CC BY-SA 4.0 许可协议
假设您使用包含多个工具和库的代码库,并且您希望在此类代码库中移植(或恢复)某些组件,但是有关符号在各个库中的位置的任何线索要么丢失,要么需要很长时间才能通过查看代码本身(是的,改进的文档可以避免此类问题,但要求很高)。发现在哪个库中可以找到代码中使用的符号的最快方法是什么?
原文由 a1an 发布,翻译遵循 CC BY-SA 4.0 许可协议
假设一个 linux 机器, nm 工具,在库文件中列出名称,来救援。
它可用于进行广泛的搜索,如下所示:首先可以使用 find 找到所有可用的库(假设项目已成功编译而没有您要添加的组件),然后可以将此类 find 包含在一个循环中在所有发现的库上调用 nm;然后 grep 的输出以丢弃“U”引用(未定义的符号,也就是在其他地方使用该符号)。在一个 bash 行上给出:
for lib in $(find base_path -name \*.a) ; do echo $lib ; nm $lib | grep my_symbol | grep -v " U " ; done
在哪里:
echo 生成一个找到的所有库的列表,这不是很干净,因为它输出不包含符号的库的名称,但它是我发现直接引用库的最快方式,所以当你看到:
base_path/component/libA.a
0000000000000080 D my_symbol
你找到了你通常的嫌疑人。
原文由 a1an 发布,翻译遵循 CC BY-SA 3.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.5k 阅读
3 回答474 阅读✓ 已解决
使用
nm
,可以列出二进制中定义的符号,并且--defined-only
开关忽略未定义的引用。选项1:
find
在一个命令中:
其中
$path
是包含二进制文件的文件树的根,而$symbol
是您要查找的符号的名称。选项 2:
find
+ GNUparallel
在所有文件上运行
nm
可能需要一些时间,因此并行处理find
的结果可能会有所帮助(使用 GNUparallel
):选项3:
fd
最后,我最喜欢的。使用
fd
工具,它的语法比find
更简单,通常更快,并且默认情况下并行处理结果:简单的基准
在我的笔记本电脑上搜索 --- 中的
/usr/lib
gz_write
符号:find
大约需要 23 秒find | parallel
大约需要 10 秒fd
大约需要 8 秒