Demangling of method names and addr2line/c++filt

Andrew Haley aph@redhat.com
Thu Feb 13 13:06:00 GMT 2003


Ranjit Mathew writes:
 > > So the questions seem to be:
 > > - Does addr2line (or addr2name) and dladdr always strip the leading
 > > underscore on platforms that need it stripped?
 > > If yes, then it seems save to always give a "-n" argument to c++filt.
 > 
 > I don't know about dladdr, but I did a bit of digging around in the 
 > GCC/binutils source code and found that:
 > 
 > 1. The GCC target-specific macro USER_LABEL_PREFIX essentially decides 
 >    if an underscore should be prefixed or not for labels corresponding
 >    to functions. You can see the target headers in the "gcc/config/*"
 >    folders to see which ones define this (quite a few).
 > 
 > 2. addr2line merely reports as the function name what it finds in the 
 >    symbolic debugging information in the executable. On Win32 for example,
 >    the debug info for a C function "t( )" is generated as:
 >         ...
 >         .stabs  "t:F(1,1)=(1,1)",36,0,4,_t
 >         ...
 >    So the symbolic name "t" gets associated with the assembler label "_t".
 > 
 >    AFAICT, it appears that USER_LABEL_PREFIX does not have a role to
 >    play in emitting symbolic debugging information (except of course the
 >    actual label with which the symbol is associated) and so the symbol
 >    would be free of underscores, except for those introduced by 
 >    C++/Java name mangling or those present in the "real" function name.
 > 
 >    Therefore, there's an implicit "stripping" of the leading underscore
 >    here, if you wish to see it that way.
 > 
 > 3. the situation with c++filt is slightly complex:
 > 
 >    a. the one in GCC (gcc/cp/cxxfilt.c) strips the leading underscore
 >       by default if USER_LABEL_PREFIX[0]=='_'.
 > 
 >    b. the one in binutils (libiberty/cplus-dem.c in binutils-2.13.2.1 and
 >       binutils/cxxfilt.c in the current CVS) strips the leading underscore 
 >       by default if "targ_underscore==yes" - this is true for a large
 >       number of targets as defined in "bfd/config.bfd".

Okay, so there is the origin of the bug.  When the libgcj code was
first written, gcc didn't have its own c++filt at all.

 > The following thread gives an insight into the c++filt mess:
 > 
 >     http://gcc.gnu.org/ml/gcc-patches/2002-09/msg00271.html
 > 
 > especially this message in the thread is directly relevant to our 
 > problem:
 > 
 >     http://gcc.gnu.org/ml/gcc-patches/2002-09/msg00779.html
 > 
 > IMHO, it is safe to say since we are giving c++filt only the mangled
 > name via addr2line

But we're not, are we?  Sometimes the mangled name comes from dladdr().

 > and not the actual assembler label that is generated, we should ask
 > it to abstain from stripping any leading and incidental underscore
 > that is a part of the mangled name.
 > 
 > And though the c++filt in both binutils and GCC are supposed to be
 > developed further in lock-step, I still think it is more reliable to
 > use and recommend the one from GCC.
 > 
 > Reading the man pages for dladdr( ), I'm a bit confused about whether
 > it uses the symbolic debugging information for a shared object or the
 > exported labels (are these two necessarily separate on all targets?)

It must be the latter, because shared libraries are often stripped.

 > themselves - if it's the former, we can safely proceed with "-n" to
 > c++filt, if it's the latter *and* underscores are used on that
 > target, then we have a problem - particularly so if we get names
 > from *both* addr2line and dladdr on that target (likely).
 > 
 > My recommendation would be to use "-n" always and cross the other bridge
 > when (if ever) we get to it.

That might be okay for the trunk, but I don't want to risk breaking
stack traces on the 3.3 branch.  We haven't got time to fix it.

I still wonder if it might be much better to do the demangling in
addr2line, and this would be a much more robust solution.  Okay, so
it's broken on some targets but presubaly that's fixable.

Andrew.



More information about the Java mailing list