2013-07-10 22 views
6

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?

+0

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

+0

@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 đó. –

+0

Chính xác thì bạn đang "cho ăn" gì vào chức năng demangle? –

Trả lời

3

Biểu tượng của bạn có quá nhiều dấu gạch dưới ở phía trước. Tôi không chắc chắn tại sao, nhưng nếu bạn kiểm tra C++filtjs, nó báo cáo cùng một điều - họ không phải là hợp lệ biểu tượng Itanium ABI với hai dấu gạch dưới ở phía trước nhưng chỉ với một. Trong trường hợp này, tôi sẽ nói rằng đầu ra của nm là không chính xác, không phải là chức năng demangle là sai. Itanium ABI chỉ định và tôi biết rằng Clang chỉ sử dụng một dấu gạch dưới.

Bạn biết đấy, nó thực sự nói điều gì đó mà tôi gần như có thể đọc được tên của Itanium ABI. Cách quá nhiều thời gian đọc đầu ra LLVM IR của Clang.

Các vấn đề liên quan