где находится исходный код C++filt?

кто-нибудь знает ссылку исходного кода C++filt. Я хочу вызвать c++filt в моем коде как библиотеку.

3 ответов


в Linux вы можете использовать /usr/include/demangle.h которой входит binutils-dev пакета. Вам придется связаться с libiberty С binutils.


Это часть binutils:

http://ftp.gnu.org/gnu/binutils/


учитывая, что разные компиляторы могут искажать по-разному, каждый из них имеет тенденцию поставляться с пользовательским фильтром c++. Но большинство систем уже будут иметь функцию библиотеки demangling, доступную где-то. На моем Linux box я нашел /usr/include/c++/version / cxxabi.H заголовок, определяющий __cxa _ demangle () (см. http://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html). Я думал, что использовал какую-то другую функцию в прошлом, но не могу найти детали (EDIT: вероятно, версия demangle Документы Исмаил). В AIX есть demangle.h.

EDIT: в большинстве систем с программами pstack и C++filt (например, Linux и Solaris) должно работать следующее...

#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();
}

...выход...

#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 ()

обратите внимание, что _ _ read_nocancel и т. д. не являются идентификаторами c++-mangled: это просто внутренние имена функций C, используя зарезервированные для реализации соглашения с подчеркиванием и прописными буквами или с двойным подчеркиванием.

X::f() был искореженный идентификатор и и был demangled.