2013-07-10 6 views
6

Я пытаюсь использовать GCC’s abi::__cxa_demangle для демонтажа символов, экспортированных из объектного файла, который был создан g++. Тем не менее, я неизменный получаю ошибкуGCC API не может развернуть свои собственные экспортированные символы

mangled_name не является допустимым именем под C++ ABI коверкая правила

Вот как я вызываю функцию:

std::string demangled(std::string const& sym) { 
    std::unique_ptr<char, void(*)(void*)> 
     name{abi::__cxa_demangle(sym.c_str(), nullptr, nullptr, nullptr), std::free}; 
    return {name.get()}; 
} 

(Обработка ошибок опущен, он присутствует в complete online demo.)

Символы, которые я тестировал с помощью получается из этого небольшого кода:

namespace foo { 
    template <typename T> 
    struct bar { bar() { } }; 
} 

void baz(int x) { } 

template struct foo::bar<int>; 

через g++ -c test.cpp; nm test.o | cut -d ' ' -f3:

EH_frame1 
__Z3bazi 
__ZN3foo3barIiEC1Ev 
__ZN3foo3barIiEC2Ev 

Я не совсем уверен, какой Цель декодирования API GCC служит, если он не может demangle этих символов - это может, однако , успешно demangle представления C++ typeid. Например. запись в тестовом коде typeid(foo::bar<int>*).name() даст PN3foo3barIiEE, который, в свою очередь, правильно развязан вышеуказанной функцией.

Я что-то не так? Как я могу демонтировать экспортированные символы из объектного файла GCC?

+0

Если объектный файл нацелен на ARM, скажем, тогда схема изменения имени будет отличаться. Тот факт, что он создан G ++, не гарантирует согласованную схему переключения имен. Тем не менее, я действительно вижу, что у этих символов слишком много подчеркиваний впереди. Попробуйте отрезать переднюю часть. – Puppy

+0

@DeadMG Интересно, не знал этого, но в моем случае это не ARM. Тем не менее, это может объяснить это. Остаются вопросы: что должен решить '__cxa_demangle', и как я могу развязать эти символы. –

+0

Что именно вы «кормите» в функцию демпфера? –

ответ

3

Ваши символы имеют слишком много подчеркиваний спереди. Я не уверен, почему, но если вы проверите C++filtjs, он сообщит об этом же - они не являются допустимыми символами Itanium ABI с двумя символами подчеркивания спереди, но только с одним. В этом случае я бы сказал, что вывод nm неверен, а не то, что функция demangle ошибочна. Itanium ABI указывает, и я знаю, что Clang использует только одно подчеркивание.

Знаешь, это действительно говорит что-то, что я могу почти читать Itanium ABI искаженные имена. Слишком много времени читает вывод Clang LLVM IR.

 Смежные вопросы

  • Нет связанных вопросов^_^