我有一个可执行程序列表,它可能会调用某个函数。我需要找出哪些所有执行者调用该函数。我知道我可以做“字符串-a”,但还有其他更好的方法来发现。完整的代码是用C写在二进制列表中查找函数调用
4
A
回答
4
您可以一起选择使用nm实用程序grep找到该可执行文件引用符号,就像这样:
nm name_of_executable | grep symbol
因此,举例来说,如果我有一个列表可能使用“strcat的”可执行文件,我可以检查是否存在使用:
for file in exectuble1 executable2 ... executableN; do references_to_strcat=`nm "$file" | grep strcat -c` if [ $references_to_strcat -ne 0 ] ; then echo "$file" fi done
以上(假设BASH)的小环将打印出来引用“strcat的”所有文件的清单。请注意,这只会告诉您哪个可执行文件实际上与该符号链接了......我无法确定哪些可执行文件可能使用动态加载引用该函数(例如,dlopen/dlsym/dlcose)。
请注意,如果您有源代码,而不仅仅是可执行文件,则可以使用Doxygen为源代码生成完整的调用图(除文档外),这是另一种可能性。
0
作为Michael Aaron Safyan's answer的变体,您可以使用objdump -d
来生成该文件的汇编列表。然后您可以通过grep -wn
来确定装配清单中发生所需功能调用的行号。一旦你有了行号,你可以查看你的列表并确定它们被调用/使用的函数/例程,以及它们如何被使用(称为,分支,推入堆栈......)。
1
strace
和ltrace
也可能是有用的。
相关问题
- 1. 使用二进制递归函数查找列表的索引
- 2. 查找表中有二进制数据
- 3. 在$ PATH中查找二进制文件
- 4. 二进制散列函数系列
- 5. 用于在二进制文件中查找十六进制序列的工具
- 6. 查找最左边的二进制数
- 7. 在二进制文件中查找模式/在二进制文件中查找匹配(C)
- 8. 最适合从二进制数据表中查找和显示列/行名称
- 9. 查找二进制二维数组中的唯一行
- 10. zend_db_select对二进制列使用十六进制查询参数
- 11. 在C++中调用二进制和一元可调用函数03
- 12. ASCII转二进制函数
- 13. 在二进制搜索树中查找数据点的深度
- 14. 在二进制数据中查找字符串
- 15. Javascript查找调用函数
- 16. 如何在Haskell中实现十进制到二进制函数
- 17. 如何从二进制数据调用函数
- 18. 查找两个二进制文件中的匹配序列
- 19. Prolog - 将二进制函数转换为n进制函数
- 20. PHP中函数的二进制标志
- 21. 二进制中的函数顺序
- 22. 从十六进制表示中查找调用网站
- 23. 哪里可以找到“通用”Linux二进制文件列表?
- 24. 用二进制搜索填充列表
- 25. 在jpl中调用列表函数
- 26. arm(裸机):调用二进制文件作为函数
- 27. 调用一个函数int值的二进制
- 28. bigint转换为二进制(8)列的二进制表示
- 29. 在Python中将2d二进制列表转换为十进制数的算法
- 30. 二分查找做了多少次递归函数调用?
你从根本上无法确定每个'dlopen()'调用的参数是什么。理论上,程序可以从标准输入中读取“dlopen”的参数。 – MSalters 2010-04-13 12:45:12
@ MSalters,我同意。这就是为什么我不知道通过动态加载来确定哪些可执行文件引用该函数的方法。理论上,可以确定dlopen()/ dlsym()的参数是否为编译时常量(或者可以从编译时常量推断出来),还是依赖用户输入生成。不过,我不知道这样做的好方法。在由用户输入生成的情况下,还可以理论上确定是否可以构建特定的函数名称(确认是否阻止该名称)等。 – 2010-04-13 23:46:59