Does anyone known the link of c++filt source code. I want call c++filt in my code as a library.
On Linux you can use /usr/include/demangle.h
which comes with binutils-dev
package. You'll have to link to the libiberty
from binutils
.
it's part of binutils:
http://ftp.gnu.org/gnu/binutils/
Given different compilers can mangle differently, each tends to ship with a custom c++filt. But, most systems will already have a demangling library function available somewhere. On my Linux box I found /usr/include/c++/version/cxxabi.h header defining __cxa_demangle() (see http://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html). I thought I'd used some other function in the past though, but can't find the details (EDIT: probably the demangle version İsmail documents). On AIX there's a demangle.h.
EDIT: on most systems with pstack and c++filt programs (i.e. Linux and Solaris), the following should work...
#include <cstdio>
#include <iostream>
#include <sstream>
struct X
{
void f()
{
std::ostringstream cmd;
cmd << "pstack " << getpid() << " | c++filt";
if (FILE* f = popen(cmd.str().c_str(), "r"))
{
char buffer[1024];
int n;
while ((n = fread(buffer, 1, sizeof buffer, f)) > 0)
std::cout.write(buffer, n);
}
else
std::cerr << "popen() failed\n";
}
};
int main()
{
X x;
x.f();
}
...output...
#0 0x003539be in __read_nocancel () from /lib/tls/i686/libc.so.6
#1 0x002ff590 in _IO_file_read_internal () from /lib/tls/i686/libc.so.6
#2 0x002fe522 in _IO_new_file_underflow () from /lib/tls/i686/libc.so.6
#3 0x00300371 in __underflow () from /lib/tls/i686/libc.so.6
#4 0x0030079d in _IO_default_xsgetn_internal () from /lib/tls/i686/libc.so.6
#5 0x00300733 in _IO_sgetn_internal () from /lib/tls/i686/libc.so.6
#6 0x002f666c in fread () from /lib/tls/i686/libc.so.6
#7 0x08048c36 in X::f ()
#8 0x08048ac0 in main ()
Notice that __read_nocancel etc are NOT C++-mangled identifiers: they're just internal C function names, using the reserved-for-implementation leading-underscore-and-uppercase-letter or leading-double-underscore convensions.
X::f()
was a mangled identifier and has been demangled.