【问题标题】:Finding Binary to C/C++ link [closed]查找二进制到 C/C++ 的链接 [关闭]
【发布时间】:2015-07-18 14:26:17
【问题描述】:

我们的构建过程很复杂。我们构建了大量的二进制文件。我想获取有关二进制(exe、dll、so)到源代码(C、C++)文件链接的信息。我想知道二进制文件是由哪些 C、C++ 文件或 lib 文件构建的。这是对我们的代码库做一个单独的分析。我们是一个 make build 文件系统来构建我们的二进制文件。我想知道是否存在提取这些信息的技术或工具。我在网站上的搜索达到了 scan-build,它在构建文件之前运行静态分析工具。

任何帮助将不胜感激。 谢谢 灰细胞

【问题讨论】:

  • 你的问题标题应该更清楚。你的问题我不清楚。您想通过使用二进制文件了解源文件在哪里吗?
  • 是什么让您无法记录和分析构建过程的输出?
  • 您使用哪些构建工具?
  • 调试版本应将源信息合并到创建的二进制文件中。
  • @amol chavan "so" 不是二进制文件,它表示库文件

标签: c++ c build makefile


【解决方案1】:

对于与特定二进制文件关联的 lib 文件,您可以使用 ldd 命令,假设您使用的是 linux 系统。

对于 c/c++ 文件,您可以在 linux 中尝试 strings 命令与 grep 命令的组合,例如strings binary | grep "\.c"
这个命令给了我用于创建二进制文件的 cpp 文件列表。我希望这就是你要找的。
同样的命令可以与库(so 文件)一起使用来查找与之关联的 C/C++。

【讨论】:

  • 这不会链接到源文件级别。
  • 调试信息(包括源文件和路径)可能仅在特殊版本中可用。这些通常不会投入生产。
  • 谢谢大家,尤其是帕万。我发现 strings 命令很有用,我还在 Linux 上找到了 readelf、objdump 和 nm 命令。还有一些工具,如 Windows 上的 objconvert。这解决了我的问题
  • 感谢@AmolChavan 的反馈:)。
【解决方案2】:

您可以使用非标准但广泛支持的#ident 指令来添加标识字符串。这通常用于向二进制文件添加版本信息或版权字符串,但您也可以使用它来记录哪些源文件进入了二进制文件。在每个源文件中,放置以下行:

#ident __FILE__

使每个源文件的文件名出现在二进制文件中。在 ELF 目标上,#ident 的参数放在 .comment 部分中,这在其他目标上可能有所不同,但通常信息以二进制形式结束。

【讨论】:

  • 谢谢,但这不是在源代码中添加任何东西的选项。我所拥有的只是发布二进制文件。我可以在 linux 上用 readelf 提取它
  • @AmolChavan 如果您只有二进制文件,则没有机会获得有关相应源文件的信息。这种信息通常不存储在二进制文件中,除非您在源文件中明确这样做。
猜你喜欢
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 2021-08-26
  • 2012-09-25
  • 1970-01-01
  • 2018-08-23
相关资源
最近更新 更多