From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kevin Buettner To: Stephen Smith , GDB Subject: Re: GDB and shared libraries Date: Tue, 27 Feb 2001 13:44:00 -0000 Message-id: <1010227214410.ZM15583@ocotillo.lan> References: <3A84136A.23BAF90F@home.com> <1010209182220.ZM4621@localhost.localdomain> <3A845A56.5EF8F61@home.com> <3A9AB471.5F46554@home.com> <1010226205415.ZM30678@localhost.localdomain> <3A9ADDF4.FD998D6E@home.com> <1010226233506.ZM13209@ocotillo.lan> <3A9B0022.16ABBBE0@home.com> <1010227013252.ZM13444@ocotillo.lan> <3A9B35E4.33B1868B@home.com> <3A9BD1C8.B1C6DDB1@cygnus.com> <3A9C18F3.A98359B9@home.com> X-SW-Source: 2001-02/msg00423.html 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