GDB加载错误的库

时间:2012-09-27 14:09:57

标签: gdb cgdb

我有两个不同版本的库让我们说     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

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:1)

  

我无法在调试期间使GDB加载正确版本的库。

我猜:你正在使用tcsh,对吧?

问题很可能来自于~/.cshrcLD_LIBRARY_PATH重置为/home/maverick/prod

当您在GDB中run程序时,它会执行$SHELL -c your-program [args...](以便允许您使用I / O重定向)。

解决方案:请勿触摸.cshrc中非交互式shell的环境,例如:从以下开始:

if ($?prompt  ==  0) exit