Debugging 如何告诉gcc(或ld)链接到标准c和c+的调试版本+;图书馆
我有libstdc++和libc的调试版本,以及其他版本,我想链接它们。它们位于/usr/lib/debug中,而不是/usr/lib。有什么想法吗?假设是LinuxDebugging 如何告诉gcc(或ld)链接到标准c和c+的调试版本+;图书馆,debugging,gcc,linker,compilation,Debugging,Gcc,Linker,Compilation,我有libstdc++和libc的调试版本,以及其他版本,我想链接它们。它们位于/usr/lib/debug中,而不是/usr/lib。有什么想法吗?假设是Linux 静态库:将-L/usr/lib/debug添加到链接器命令行gcc/ld将在默认系统目录之前查看。使用ldd命令验证链接的库版本是否正确(仅限共享库) 共享库:设置LD\u LIBRARY\u PATH=usr/lib/debug,即使没有步骤1,只要有一个库版本,您的应用程序也会从那里获取库,如果您使用发行版的软件包管理器进行安
-L/usr/lib/debug
添加到链接器命令行gcc
/ld
将在默认系统目录之前查看。使用ldd
命令验证链接的库版本是否正确(仅限共享库)LD\u LIBRARY\u PATH=usr/lib/debug
,即使没有步骤1,只要有一个库版本,您的应用程序也会从那里获取库,如果您使用发行版的软件包管理器进行安装,这很可能发生不过,最好同时执行这两种操作,因为有些库可能只是静态形式。使用链接器标志ld/gcc
-L
仅对链接时间很重要,无论是共享还是静态的,如果链接器找不到库,则无法针对库进行链接
对于共享库,环境变量
LD_LIBRARY_PATH
对于启动时间很重要。动态库加载器ld.so和ld linux.so在启动应用程序时将在那里查找。我认为公认的答案是误导的,因为/usr/lib/debug
中的库不是/lib
中库的调试编译(-g-O0…)版本,/usr/lib
,但只需调试从/lib
,/usr/lib
中相应库中剥离的符号即可。有关更多详细信息,请参阅对和的已接受答案的解释
引述:
/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
,但没有内容
。与/lib/x86_64-linux-gnu/libc-2.19中相应的库进行比较。因此:
$ 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
这是可行的,但我想我必须更改LD_LIBRARY_路径才能加载调试共享库,对吗?@Jonathan Fischoff,如果你是针对共享库进行链接,是的。