Я пытаюсь использовать 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?
Если объектный файл нацелен на ARM, скажем, тогда схема изменения имени будет отличаться. Тот факт, что он создан G ++, не гарантирует согласованную схему переключения имен. Тем не менее, я действительно вижу, что у этих символов слишком много подчеркиваний впереди. Попробуйте отрезать переднюю часть. – Puppy
@DeadMG Интересно, не знал этого, но в моем случае это не ARM. Тем не менее, это может объяснить это. Остаются вопросы: что должен решить '__cxa_demangle', и как я могу развязать эти символы. –
Что именно вы «кормите» в функцию демпфера? –