2016-04-03 12 views
0

Ich habe einen Versuch auf den minimalen Testfall gemacht. Dieser Fall gibt rhel-7 mit devtoolset-4 (gcc-5.2) weiter und scheitert unter rhel-6. Status -2 bedeutet "Mangled_name ist kein gültiger Name unter den C++ ABI Mangelregeln." https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.3/a01696.html__cxa_demangle scheitert an rhel6 (centos6) mit devtoolset-4 gcc-5.2

Mache ich alles falsch oder ist das ein Fehler, muss ich irgendwie arbeiten, wenn ich gcc-5.2 auf RHEL-6 verwenden möchte? Wenn ja, irgendwelche Empfehlungen? Mein bester Gedanke ist bisher, "IJ" in dem entstellten Namen zu "II" zu regexieren, bevor es zu __cxa_demangle() gegeben wird. Wenn das wahrscheinlich relativ zuverlässig ist, kann ich damit leben.

#include <iostream> 
#include <string> 
#include <tuple> 
#include <typeinfo> 
#include <cxxabi.h> 

#define DUMP(x) std::cout << #x << " is " << x << std::endl 

template<typename T> 
void print_type(T t) 
{ 
    int status; 
    auto name = typeid(t).name(); 
    DUMP(name); 
    auto thing2 = abi::__cxa_demangle(name, 0, 0, &status); 
    if(status == 0) 
    { 
     DUMP(thing2); 
    } 
    else 
    { 
     std::cout << typeid(t).name() << " failed to demangle\n"; 
     DUMP(status); 
    } 
} 

typedef std::tuple<foo_t, foo_t> b_t; 

int main(int argc, char **argv) 
{ 
    std::tuple<bool, bool> t; 
    print_type(t); 
} 

Centos-6-Ausgang

name is St5tupleIJbbEE 
St5tupleIJbbEE failed to demangle 
status is -2 

Centos-7 Ausgang

name is St5tupleIJbbEE 
thing2 is std::tuple<bool, bool> 

Centos-6-Ausgang mit devtoolset-3 (gcc-4,9)

name is St5tupleIIbbEE 
thing2 is std::tuple<bool, bool> 
+0

Gab es keinen ABI-Wechsel zwischen gcc 4 und 5? Ich bin kein Experte, aber ich erinnere mich, dass meine Kollegin darüber gesprochen hat. –

Antwort

0
std::string typestring(typeid(T).name()); 
auto pos = typestring.find("IJ"); 
if(pos != std::string::npos) 
{ 
    // gcc-5.2 uses IJ in typestring where 
    // gcc-4.9 used II - this fugly hack makes 
    // cxa_demangle work on centos/rhel-6 with gcc-5.2 
    // eg std::tuple<bool, bool> 
    typestring[pos + 1] = 'I'; 
} 
rv = abi::__cxa_demangle(typestring.c_str(), 0, 0, &status); 
Verwandte Themen