Re: [RFC] make gdb handle weak function better

Chris January
2010-08-11T08:05:39Z

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