How to make gdb print characters in shared libraries loaded by dlopen?

I want to debug a process running on Linux 2.6 using GDB. attach PID (where PID is the process identifier), print main , print sin , print gzopen and print dlopen work (i.e. find the corresponding characters). But print myfoo does not work, where myfoo is a function loaded by a process from a .so file using dlopen . Here is what I get:

 (gdb) print main $3 = {int (int, char **)} 0x805ba90 <main> (gdb) print sin $4 = {<text variable, no debug info>} 0xb7701230 <sin> (gdb) print gzopen $5 = {<text variable, no debug info>} 0xb720df50 <gzopen> (gdb) print dlopen $6 = {<text variable, no debug info>} 0xb77248e0 <__dlopen_nocheck> (gdb) print myfoo No symbol "myfoo" in current context. 

How do I get gdb to find myfoo ?

The myfoo function really exists, because in the program I managed to get its address using dlsym (after dlopen ), and I managed to call it. Only after that I connected GDB to the process.

It turned out that there was an error message mydir/mylib.so: No such file or directory , printed by the attach $PID GDB command. Obviously, GDB was running in the wrong directory. Running the correct cd before starting GDB print myfoo problem and print myfoo started to work.

I would like to automate this: I want GDB to find out where my .so files are (downloaded with dlopen ). The approximation I can think of is looking at /proc/$PID/maps (on Linux), finding possible directories and adding all of them to the GDB library search path before starting GDB. The LD_LIBRARY_PATH extension and the execution of set solib-search-path /tmp/parent did not work ( ls -l /tmp/parent/mydir/myfoo.so really works), GDB still reported No such file or directory . How to tell GDB where to look for mydir/myfoo.so ?

My other question is: how do I get a list of possible directories? Linux /proc/$PID/maps contains them, but what about other operating systems such as FreeBSD and Mac OS X?

+8
linux shared-libraries gdb
source share
3 answers

There seems to be no easy way to automate the search for .so files in GDB.

0
source share
The "info target" command in gdb will show a list of all sections in all loaded shared objects (including the dlopen () ed libraries). At least it works on Linux - I don't know how it works on other operating systems.
+3
source share

I support a program that loads a shared library through dlopen () and successfully accesses characters in the shared library using GDB. This will work, however, if the shared library has a character table.

0
source share

Source: https://habr.com/ru/post/649961/


All Articles