Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

make gdb load a shared library from a specific path

I got a core while executing an application and I saved the executable, the corefile and a shared library which the application use in /tmp to check them later. I then modified the library, rebuilt it and started the executable again. Now when I am trying to debug the core, gdb is loading the shared library from its original path and not from the directory /tmp where I saved the original library.

For example, the original path was /opt/mydir/lib/libmylib.so.0. gdb is loading this shared library, while I want it to load /tmp/libmylib.so.0. The application also uses some standard libraries which are in /usr/lib and /lib directories so I don't want these paths to get changed. Just want to change /opt/mydir/lib/ -> /tmp. How can I do that?

like image 662
ashish Avatar asked Nov 24 '15 06:11

ashish


People also ask

Do you need set Solib search path or set Sysroot GDB?

If you want to use ' solib-search-path ' instead of ' sysroot ', be sure to set ' sysroot ' to a nonexistent directory to prevent GDB from finding your host's libraries. ' sysroot ' is preferred; setting it to a nonexistent directory may interfere with automatic loading of shared library symbols.

What is Solib search path?

Specifies directories where GDB will search for shared libraries with symbols. This option is useful when debugging with gdbserver.

What is set Sysroot?

Specifies the system root directory to search for shared library symbols. The debugger uses this directory to search for a copy of the debug versions of target shared libraries. The system root on the host workstation must contain an exact representation of the libraries on the target root filesystem.

How do I add a breakpoint in GDB?

Setting breakpoints A breakpoint is like a stop sign in your code -- whenever gdb gets to a breakpoint it halts execution of your program and allows you to examine it. To set breakpoints, type "break [filename]:[linenumber]".


1 Answers

The simplest solution is to temporarily restore /opt/mydir/lib/libmylib.so.0 to the copy that was used at crash time (i.e. the one now in /tmp), analyse the core, then restore back the new version.

If you don't want to do that, set solib-search-path and set sysroot are your friends.

Note that you must set both before loading the core. This sequence should work:

(gdb) set sysroot /no/such/file
(gdb) set solib-search-path /tmp:/usr/lib:/lib
(gdb) core /tmp/core
like image 142
Employed Russian Avatar answered Sep 30 '22 07:09

Employed Russian