我有两个不同版本的库,比如说 libxyz.so
在两个不同的位置
1) /home/maverick/dev/libxyz.so ( development Version)
2) /home/maverick/prod/libxyz.so ( Production Version )
我有一个设置,可以编译我的程序并根据 LD_LIBRARY_PATH 链接到适当版本的库。例如,如果我想将我的程序与 libxyz 的 dev 版本链接,我将 LD_LIBRARY_PATH 更改为添加 /home/maverick/dev,如果我想与 prod 版本链接,我将 LD_LIBRARY_PATH 更改为添加 /home/maverick/prod。
我通过链接开发版本和输出来编译我的程序
ldd MyProg
是
libxyz.so => /home/maverick/dev/libxyz.so
如果我运行程序,它会从
/home/maverick/dev/libxyz.so
并且运行良好。这一点我的 LD_LIBRARY_PATH 包括 /home/maverick/dev 而不是 /home/maverick/prod
但是当我尝试通过 GDB 调试这个程序时
gdb MyProg
它从位置加载 libxyz.so
/home/maverick/prod/libxyz.so
我在调试期间无法让 GDB 加载正确版本的库。所以到目前为止,我正在做的是首先启动程序(加载开发版本)并将gdb附加到该PID,这样它就可以正常工作了。但如果它像
gdb MyProg
它没有
我尝试了所有方法来解决这个问题,比如在 GDB 中设置 sysroot、solib-search-path,但没有任何效果。如果事实上当我设置 sysroot 指向库 gdb 的调试版本时给出了一些类似的消息
.dynamic section for XXX is not at the expected address
任何建议将不胜感激。