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

AltStyle によって変換されたページ (->オリジナル) /