From: Chris January <chris.january@allinea.com>
To: Hui Zhu <teawater@gmail.com>
Cc: gdb@sourceware.org
Subject: Re: [RFC] make gdb handle weak function better
Date: Wed, 11 Aug 2010 08:05:00 -0000 [thread overview]
Message-ID: <1281513884.1935.7.camel@gumtree> (raw)
In-Reply-To: <AANLkTi=xdE6=M09NiP_8Vr6OaRsH0s=1R_w8cfmZi8E3@mail.gmail.com>
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
next prev parent reply other threads:[~2010-08-11 8:05 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-08-05 9:04 Hui Zhu
2010-08-11 3:21 ` Hui Zhu
2010-08-11 8:05 ` Chris January [this message]
2010-08-11 20:31 ` Daniel Jacobowitz
2010-08-12 3:17 ` Hui Zhu
2010-08-18 8:17 ` Chris January
2011-08-09 9:11 ` Hui Zhu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1281513884.1935.7.camel@gumtree \
--to=chris.january@allinea.com \
--cc=gdb@sourceware.org \
--cc=teawater@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox