【问题标题】:How to see which static libraries were used for gcc/g++ compilation from the generated binary?如何从生成的二进制文件中查看哪些静态库用于 gcc/g++ 编译?
【发布时间】:2013-05-31 17:36:27
【问题描述】:
上下文:我正在使用 linux 工具链(包括 g++、其他构建工具、库、头文件等)来使用静态链接库构建我的代码。我想确保我只使用我的工具链中的库/头文件,而不是构建机器上的默认库/头文件。我可以使用strace 来查看 g++ 正在做什么(它正在使用哪些库),同时它正在编译哪个 在正常情况下会有所帮助 - 但我的构建系统有很多围绕 g++ 的包装器,它们隐藏所有的输出。
问题:有没有办法从静态链接的二进制文件中获取有关用于创建二进制文件的库和头文件的任何有用信息?我查看了objdump 工具,但不确定它是否有很大帮助。
【问题讨论】:
标签:
linux
compiler-construction
g++
static-libraries
cross-compiling
【解决方案1】:
只需在链接时将-v 传递给g++ 或gcc。它将显示所有链接的库。也许试试make CC='gcc -v' CXX='g++ -v'
更一般地,-v 传递 g++ 或 gcc 向您显示底层命令及其参数,因为 gcc 或 g++ 只是一个驱动程序(启动 cc1、ld 或 @987654332 @, as, ...)
通过将 -H 标志传递给 GCC(即 g++ 或 gcc),您可以看到每个包含的标头。因此,您可以检查是否仅包含您期望的标头。
您看不到链接了哪些静态库,因为链接静态库仅意味着链接其中的相关目标文件成员,因此静态库可以(并且通常是)仅部分链接。
您可以使用nm 命令从此类库中查找名称。
【解决方案2】:
如果您可以简单地重新编译,那么有一些方法(使用 Basile 解释的一些技术)来获取头文件和库(静态或动态),但不幸的是,无法知道在编译之后使用了哪些库编译完成。