这个警告意味着什么?

时间:2010-11-15 07:58:12

标签: linux dynamic gdb warnings

我经常遇到gdb的以下警告:

warning: .dynamic section for XXX is not at the expected address

其中XXX是某个库的名称。 最近我得到了libgobject-2.0.so。我的应用程序使用GTK。直到昨天我从存储库中同步了最新的代码并重新构建它之前,gdb一直没有问题地启动它。从那以后,它一直在抱怨.dynamic部分。有什么可能的原因呢?我该如何解决它们?

2 个答案:

答案 0 :(得分:6)

某些gdb版本实际上对该警告更有帮助。他们输出如下内容:

警告:“libhello.so”的.dynamic部分不在预期的地址(错误的库或版本不匹配?)

确保GDB找到您的程序实际编译过的库,并且在应用程序和库中的任何调试符号(如果在单独的文件中)是最新的并且与您正在使用的构建一致。

升级听起来像是一个原因的好嫌疑人。预链接库也可能会出现此警告,但我认为gdb可以处理这种情况。

答案 1 :(得分:0)

我刚才也遇到了这个问题,这不可能是thkala提到的……引起的现场调查。

我正在运行一个gdb。 ps fax | grep -B1 jackdbus显示:

61747 pts/8    Sl+    0:00  |       \_ gdb
61764 pts/8    t      0:00  |           \_ /usr/src/jack2/pkg/jack2/usr/bin/jackdbus auto

在该gdb中,我在main上有一个断点(因此它从未真正运行过),但是我确实运行了它(使用arg auto)来加载共享库,并gdb打印:

warning: .dynamic section for "/usr/src/jack2/pkg/jack2/usr/lib/libjackserver.so.0" is not at the expected address (wrong library or version mismatch?)

除非jack2的构建系统存在极端错误,否则这两个是一起的(同时编译)。

那是什么导致此警告?我的调查:

# cat /proc/61764/maps | grep 'jack'
555555554000-55555555a000 r--p 00000000 00:2f 33145                      /usr/src/jack2/pkg/jack2/usr/bin/jackdbus
55555555a000-555555566000 r-xp 00006000 00:2f 33145                      /usr/src/jack2/pkg/jack2/usr/bin/jackdbus
555555566000-55555556d000 r--p 00012000 00:2f 33145                      /usr/src/jack2/pkg/jack2/usr/bin/jackdbus
55555556e000-555555570000 r--p 00019000 00:2f 33145                      /usr/src/jack2/pkg/jack2/usr/bin/jackdbus
555555570000-555555571000 rw-p 0001b000 00:2f 33145                      /usr/src/jack2/pkg/jack2/usr/bin/jackdbus
7ffff7efe000-7ffff7f29000 r--p 00000000 fe:03 1976021                    /usr/lib/libjackserver.so.0.1.0
7ffff7f29000-7ffff7f72000 r-xp 0002b000 fe:03 1976021                    /usr/lib/libjackserver.so.0.1.0
7ffff7f72000-7ffff7f99000 r--p 00074000 fe:03 1976021                    /usr/lib/libjackserver.so.0.1.0
7ffff7f99000-7ffff7f9a000 ---p 0009b000 fe:03 1976021                    /usr/lib/libjackserver.so.0.1.0
7ffff7f9a000-7ffff7fa0000 r--p 0009b000 fe:03 1976021                    /usr/lib/libjackserver.so.0.1.0
7ffff7fa0000-7ffff7fa1000 rw-p 000a1000 fe:03 1976021                    /usr/lib/libjackserver.so.0.1.0

合而为一...已加载的 actual 共享库为/usr/lib/libjackserver.so.0.1.0

gdb只是在实际加载的路径上撒谎(并且仍然是thkala提到的情况)!

还要注意info shared的输出:

From                To                  Syms Read   Shared Object Library
0x00007ffff7f29040  0x00007ffff7f71ed3  Yes         /usr/src/jack2/pkg/jack2/usr/lib/libjackserver.so.0

该路径 上的库具有调试信息(但(*)下面缺少的Read)表示Shared library is missing debugging information.表示实际库已加载并这里显示的路径不相同。

请注意,我设置了以下gdb变量:

(gdb) show sysroot
The current system root is "/nonexistent".
(gdb) show solib-search-path
The search path for loading non-absolute shared library symbol files is /usr/src/jack2/pkg/jack2/usr/lib:/usr/lib.

(有关原因,请参阅第https://sourceware.org/gdb/current/onlinedocs/gdb/Files.html#index-shared-libraries页的set solib-search-path)。

显然,设置solib-search-path对gdb在何处查找共享库有影响,但对实际加载的共享库没有影响。

因此,在回答this之后,我也向set environment LD_LIBRARY_PATH=/usr/src/jack2/pkg/jack2/usr/lib添加了/usr/src/jack2/.gdbinit(从我运行gdb的位置开始;请注意,我在~/.gdbinit中有一行:add-auto-load-safe-path /usr/src/jack2,以便实际加载它)。原来,我还可以简单地删除设置sysroot和solib-search-path的行。完整的.gdbinit现在是:

cd /usr/src/jack2
directory src/jack2-1.9.14/linux
set environment LD_LIBRARY_PATH=/usr/src/jack2/pkg/jack2/usr/lib
file pkg/jack2/usr/bin/jackdbus
set args auto
b main
command 1
b JackLinuxFutex.cpp:137
b JackLinuxFutex.cpp:156
end
run

这解决了问题。