如果我有一个C ++源文件,gcc可以使用-H选项在树结构中提供所有依赖项。但是只给出C ++可执行文件,是否可以找到进入其编译和链接的所有库和头文件?
答案 0 :(得分:1)
您不能这样做,因为该可执行文件可能是在头文件(或C ++代码或库)是私有的甚至是生成的机器上构建的。此外,如果链接了静态库,则无法找到可靠的方法。
在实践中,在Linux上,在可执行文件上使用nm
或objdump
或ldd
经常(但并非总是如此)为您提供了一个很好的线索关于所需的图书馆。
此外,一些可执行文件动态加载plugin,例如使用dlopen,所以你的问题可能没有任何意义(因为该插件只在运行时才知道)。
另请注意,您可能不知道是否通过编译某些C ++代码获得了可执行文件(您可能无法判断它是从C,C ++,D或Ocaml获得的,...源代码,还是混合物)。
在Linux上,如果使用静态链接和剥离构建可执行文件,人们将无法轻易猜出您使用的源编程语言。
BTW,在Linux发行版上,package management system的角色是处理这种依赖。如果answered by Yochai Timmer,如果可执行文件包含调试信息(例如,以DWARF格式),您应该能够获得更多信息。
答案 1 :(得分:1)
如果您使用调试符号编译了可执行文件,然后是,则可以使用这些符号来获取文件。
如果您有.pdb文件(Visual Studio创建它们以单独存储调配信息),您可以使用各种程序打开它们并查看源文件和方法。
你甚至可以用文本编辑器打开它,你会在gibrish中看到一个函数和源文件列表。
如果您正在使用linux(或一般的GNU编译器),则可以使用gdb(仅在编译时启用调试符号时才会使用)。
在可执行文件上运行gdb,然后运行命令:info sources
这是您在投入生产时应始终删除该标志的重要原因。您不希望客户端弄乱您的源,函数和代码。