This is the mail archive of the gdb@sourceware.org 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]
Other format: [Raw text]

Re: [RFC] make gdb handle weak function better


On Wed, 2010-08-11 at 11:21 +0800, Hui Zhu wrote:
> > (gdb) info sharedlibrary
> > From        To          Syms Read   Shared Object Library
> > 0xb7fe47f0  0xb7ff97df  Yes (*)     /lib/ld-linux.so.2
> > 0xb7e80230  0xb7f80ea4  Yes (*)     /lib/tls/i686/cmov/libc.so.6
> > (*): Shared library is missing debugging information.
> >
> > Program exited with code 010.
> >
> > The inferior is not break because gdb set breakpoint in the weak
> > function calloc in lib/ld-linux.so.2.
> > But the inferior call the calloc in /lib/tls/i686/cmov/libc.so.6.
> >
> > And I check the lookup_symbol and lookup_minimal_symbol, both of them
> > are return the first symbol that they found.
> > What about do some work on it?
> >
> > What I think is:
> > In lookup_symbol and lookup_minimal_symbol, when it get a weak symbol,
> > just record it but keep search.  When the search complete, if GDB get
> > a simple symbol then return it.  If GDB doesn't get a simple symbol.
> > Then return the weak symbol.

I don't think this is right. My understanding is that the linker
(ld-linux) doesn't keep searching other shared libraries if it finds a
weak symbol. So the search order is as follows:
1. 'strong' calloc in libc.so.6.
2. 'weak' calloc in libc.so.6.
3. 'strong' calloc in ld-linux.so.2.
4. 'weak' calloc in ld-linux.so.2.

Notice that a 'weak' calloc in libc trumps any definition of calloc in
ld-linux.

The problem with gdb is that it search the shared libraries in the order
they were loaded - notice info sharedlibrary gave you ld-linux first
instead of libc - so gdb incorrectly picks ld-linux's calloc. As a
general heuristic gdb should instead start looking for symbols in the
most recently loaded shared library (i.e. objfile) (after the main
executable) and work backwards. This doesn't necessarily match the
dynamic linker's behaviour exactly, but it gets pretty close for little
effort.

Regards,
Chris




This e-mail message may contain confidential and/or privileged information. If you are not an addressee or otherwise authorized to receive this message, you should not use, copy, disclose or take any action based on this e-mail or any information contained in the message.
If you have received this material in error, please advise the sender immediately by reply e-mail and delete this message. Thank you.
Allinea Software Limited: Registered in England and Wales No: 6871298
Registered Address: The Innovation Centre, Warwick Technology Park, Gallows Hill, Warwick, CV34 6UW, United Kingdom


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