我有两个不同版本的库让我们说 libxyz.so
在两个不同的位置
1) /home/maverick/dev/libxyz.so ( development Version)
2) /home/maverick/prod/libxyz.so ( Production Version )
我有一个设置可以编译我的程序并根据LD_LIBRARY_PATH链接到相应版本的库。例如,如果我想将我的程序与开发版本的libxyz.so链接,我将LD_LIBRARY_PATH更改为添加/ home / maverick / dev,如果我想与prod版本链接,请更改LD_LIBRARY_PATH以添加/ home / maverick / prod。
我通过链接dev版本和
的输出来编译我的程序ldd MyProg
是
libxyz.so => /home/maverick/dev/libxyz.so
如果我运行该程序,它将从
加载libxyz.so/home/maverick/dev/libxyz.so
并且运行良好。 这一点我的LD_LIBRARY_PATH包含/ home / maverick / dev not / 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
任何建议都将不胜感激。
答案 0 :(得分:1)
我无法在调试期间使GDB加载正确版本的库。
我猜:你正在使用tcsh
,对吧?
问题很可能来自于~/.cshrc
将LD_LIBRARY_PATH
重置为/home/maverick/prod
。
当您在GDB中run
程序时,它会执行$SHELL -c your-program [args...]
(以便允许您使用I / O重定向)。
解决方案:请勿触摸.cshrc
中非交互式shell的环境,例如:从以下开始:
if ($?prompt == 0) exit