API GCC не может разобрать свои собственные экспортированные символы

Я пытаюсь использовать ССЗ 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?

6

Решение

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

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]