【发布时间】:2011-03-10 21:40:24
【问题描述】:
我有调试版本的 libstdc++ 和 libc 等,并希望链接它们。它们位于 /usr/lib/debug 中,而不是 /usr/lib。有什么想法吗?
【问题讨论】:
标签: debugging gcc linker compilation
我有调试版本的 libstdc++ 和 libc 等,并希望链接它们。它们位于 /usr/lib/debug 中,而不是 /usr/lib。有什么想法吗?
【问题讨论】:
标签: debugging gcc linker compilation
我认为接受的答案具有误导性,因为 /usr/lib/debug 中的库不是 /lib,/usr/lib 中库的调试编译 (-g -O0 ...) 版本,而只是调试从/lib,/usr/lib 中的对应库。请参阅How to use debug version of libc 和How to link against debug versions of libc and libstdc++ in GCC? 接受的答案的解释更多详细信息。
行情:
/usr/lib/debug中的库不是真正的库。相反,仅包含调试信息,但不包含真正 libc.so.6 的.text或.data部分
和
在许多 Linux 安装中,调试库不包含实际代码;它们只包含调试信息。两者是分开的,如果你不需要它们并且磁盘空间不足,你可以选择不安装它们,但调试库本身并不好。
检查自己:
objdump -h /usr/lib/debug/lib/x86_64-linux-gnu/libc-2.19.so | grep -C1 text
11 .text 001488a3 000000000001f520 000000000001f520 000002b4 2**4
ALLOC, READONLY, CODE
.text 段是 ALLOC,但没有 CONTENTS。对比/lib/x86_64-linux-gnu/libc-2.19.so中对应的库:
$ objdump -h /lib/x86_64-linux-gnu/libc-2.19.so | grep -C1 text
11 .text 001488a3 000000000001f520 000000000001f520 0001f520 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
【讨论】:
假设 Linux,
-L/usr/lib/debug 添加到链接器命令行。 gcc/ld 将在默认系统目录之前查找。使用 ldd 命令验证是否链接了正确的库版本(仅限共享库)。LD_LIBRARY_PATH=usr/lib/debug,即使没有第 1 步,您的应用程序也会从那里获取库,只要有一个库版本,如果您使用发行版的包管理器进行安装,这很有可能。
不过,两者都做是个好主意,因为有些库可能只是静态形式。
【讨论】:
使用链接器标志。 ld/gcc -L<LIBRARY_PATH> 仅对链接时间很重要,无论共享还是静态,如果链接器找不到它,您就无法链接到库。
对于共享库,环境变量LD_LIBRARY_PATH 对启动时间很重要。当您启动应用程序时,动态库加载器 ld.so 和 ld-linux.so 会在那里查找。
【讨论】: