0

我有两个不同版本的库,比如说 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

任何建议将不胜感激。

4

1 回答 1

1

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

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

问题很可能来自您~/.cshrc重置LD_LIBRARY_PATH/home/maverick/prod.

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

解决方案:不要在你.cshrc的非交互式 shell 中触摸环境,例如:

if ($?prompt  ==  0) exit
于 2012-09-27T14:58:25.083 回答