我经常遇到gdb的以下警告:
warning: .dynamic section for XXX is not at the
expected address
其中XXX是某个库的名称。 最近我得到了libgobject-2.0.so。我的应用程序使用GTK。直到昨天我从存储库中同步了最新的代码并重新构建它之前,gdb一直没有问题地启动它。从那以后,它一直在抱怨.dynamic部分。有什么可能的原因呢?我该如何解决它们?
答案 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
这解决了问题。