This is the mail archive of the gdb@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: GDB and shared libraries


On Feb 27,  2:15pm, Stephen Smith wrote:

> On the target I have the application testapp.exe and the library
> libtestlib.so.  When the OS loads testapp.exe and libtestlib.so it
> does the fixups and (since we wrote the OS and the gdbserver) we can
> see the elf headers for both files.  We also currently can debug
> testapp.exe itself.
> 
> Now, the function main() has a call to lib1Func() which is defined
> inside of libtestlib.so.  I would like to trace into that function.
> 
> Questions:
>      1)  In the protocol
>            http://sources.redhat.com/gdb/onlinedocs/gdb_14.html#SEC120
>          I don't see a way to pass back the fixup results that the loader
>          performed.  Don't I need to do that?

Maybe, maybe not.  As Andrew indicated in his message, you might
be able to do it all by reading memory, writing memory, and setting
breakpoints.  In the event that you can't, I suggest using the "q"
packet so that GDB can fetch the shared library information from
gdbserver.  You'll need to modify gdb to generate (send) the "q"
packet at the appropriate point in the code (which will likely be in
your solib backend) and you'll need to modify gdbserver to recognize
your special "q" packet and return the shared library information in a
mutually agreed upon format.

>      2) When I step into the function, lib1Func(), how does the
>         gdbserver tell gdb that it needs to load the symbol table
>         from the file libtestlib.so?

The idea is for the symbol table to be loaded (by GDB) prior to ending
up in lib1Func().  For this to happen, GDB needs to be told when a
shared library has been loaded by the dynamic linker.  Again, one of
the ways this is commonly done is for gdb to set an internal
breakpoint in a special do-nothing function that the shared library
machinery agrees to call after it's loaded a shared library.  But it
could be done in other ways too.

Anyway, once GDB has been told that there are (potentially) new
libraries loaded, GDB then attempts to find the load information
that you refer to.  It then loads the symbol table and applies
the necessary relocations.

The point is that all of this occurs before you've ever hit lib1Func().

Kevin


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]