Tôi đang cố sử dụng GCC’s abi::__cxa_demangle
để biểu tượng demangle được xuất từ tệp đối tượng được tạo bởi g++
. Tuy nhiên, tôi không thay đổi nhận được lỗiAPI GCC không thể gỡ rối các biểu tượng đã xuất của riêng mình
mangled_name không phải là một tên hợp lệ theo quy định C++ ABI mangling
Đây là cách tôi gọi hàm:
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()};
}
(Lỗi xử lý bỏ qua; nó hiện diện trong số complete online demo.)
Ký hiệu tôi đã thử nghiệm bằng thu được từ mã này nhỏ:
namespace foo {
template <typename T>
struct bar { bar() { } };
}
void baz(int x) { }
template struct foo::bar<int>;
qua g++ -c test.cpp; nm test.o | cut -d ' ' -f3
:
EH_frame1
__Z3bazi
__ZN3foo3barIiEC1Ev
__ZN3foo3barIiEC2Ev
Tôi không thực sự chắc chắn mà mục đích demangling API GCC phục vụ nếu nó không thể demangle các biểu tượng này - nó thể, tuy nhiên , đã phá hủy thành công đại diện C++ typeid
. Ví dụ. viết trong mã thử nghiệm typeid(foo::bar<int>*).name()
sẽ mang lại PN3foo3barIiEE
, do đó sẽ bị xóa một cách chính xác bởi hàm trên.
Tôi có làm gì sai không? Làm thế nào tôi có thể tháo gỡ các biểu tượng được xuất từ một tệp đối tượng GCC?
Nếu tệp đối tượng nhắm mục tiêu ARM, thì lược đồ mangling tên sẽ khác nhau. Thực tế là nó được tạo ra bởi G + + không đảm bảo một lược đồ mangling tên phù hợp. Tuy nhiên, những gì tôi thực sự thấy là những biểu tượng đó có quá nhiều dấu gạch dưới ở phía trước. Hãy thử cắt một mặt trước. – Puppy
@DeadMG Thú vị, không biết điều đó, nhưng trong trường hợp của tôi nó không thực sự là ARM. Tuy nhiên, điều này có thể giải thích nó. Các câu hỏi còn lại: '__cxa_demangle' nghĩa vụ phải giải quyết là gì, và làm cách nào để tháo gỡ những biểu tượng đó. –
Chính xác thì bạn đang "cho ăn" gì vào chức năng demangle? –