Я пытаюсь использовать ССЗ abi::__cxa_demangle
разделить символы, экспортированные из объектного файла, созданного g++
, Впрочем, я неизменно получаю ошибку
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()};
}
(Обработка ошибок опущена; она присутствует в полная онлайн-демонстрация.)
Символы, которые я тестировал, получены из этого небольшого кода:
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, если он не может разорвать эти символы — он Можно, Тем не менее, успешно разобрать C ++ typeid
представления. Например. запись в тестовом коде typeid(foo::bar<int>*).name()
даст PN3foo3barIiEE
, который, в свою очередь, правильно определяется вышеприведенной функцией.
Я делаю что-то неправильно? Как я могу удалить экспортированные символы из объектного файла GCC?
У ваших символов слишком много подчеркиваний впереди. Я не уверен почему, но если вы проверите C ++ filtjs, он сообщает об одном и том же — они не являются действительными символами Itanium ABI с двумя подчеркиваниями спереди, а с одним. В этом случае я бы сказал, что выход nm
неверно, не то, что функция demangle неверна. Itanium ABI указывает, и я знаю, что Clang использует только одно подчеркивание.
Знаете, это действительно говорит о том, что я уже почти могу читать искаженные имена Itanium ABI. Слишком много времени на чтение ИК-выхода Clang LLVM.
Других решений пока нет …