2012-02-23 15 views
14

Tôi có một tệp đối tượng C++ chứa các phiên bản của một số hàm mẫu C++. Tệp đối tượng được đề cập khởi tạo cùng một hàm cho một vài kết hợp khác nhau của tham số mẫu. Tôi đang cố gắng để gỡ lỗi một vấn đề và muốn xem xét việc tháo gỡ của một instantiation cụ thể của các chức năng mẫu (có nghĩa là, tôi biết các thông số mẫu cho các chức năng mà tôi muốn kiểm tra). Tôi thường làm điều này bằng cách sử dụng objdump để tháo rời tệp đối tượng, nhưng nó (ít nhất theo mặc định) không thể loại bỏ tên hàm C++. Có cách nào để làm điều này không? Các tệp đối tượng được tạo bằng gcc 4.6.1.Có thể objdump un-mangle tên của chức năng mẫu C++?

Trả lời

13

Đường ống qua c++filt? Có thể cần phải cung cấp cho nó -n tùy thuộc vào việc các biểu tượng có đến w/hoặc w/o dấu gạch dưới hàng đầu hay không.

+4

Có vẻ như điều đó sẽ hiệu quả. Tôi cũng chỉ tìm thấy tùy chọn '-C' cho' objdump', dường như nó hoạt động cho ứng dụng của tôi ít nhất. –

+0

@JasonR thậm chí tốt hơn. Trong lịch sử đã có các lựa chọn và tên biến thể như 'nm ++ 'nhưng chúng bị đánh và bỏ lỡ và tôi đã có thói quen chỉ là đường ống mọi thứ. – smparkes

+0

@ JasonR, cảm ơn bạn đã đăng bài này ... '-C' không được đăng ký trong phiên bản' objdump' của tôi (không hiển thị với '--help') nhưng nó vẫn hoạt động. –

8

objdump -C làm như được đề cập bởi Jason R trong nhận xét.

man objdump nói:

Giải mã (demangle) tên biểu tượng ở mức độ thấp vào tên người dùng cấp. Bên cạnh việc loại bỏ bất kỳ dấu gạch dưới ban đầu nào được thêm vào trước bởi hệ thống, điều này làm cho các tên hàm C++ có thể đọc được. Trình biên dịch khác nhau có phong cách mangling khác nhau. Đối số kiểu tùy chọn demangling tùy chọn có thể được sử dụng để chọn kiểu demangling thích hợp cho trình biên dịch của bạn.

Mẫu đầu ra trên một operator new[] trên và objdump -CSr gọi:

char *sn = new char[4]; 
10: bf 04 00 00 00   mov $0x4,%edi 
15: e8 00 00 00 00   callq 1a <main+0x1a> 
         16: R_X86_64_PC32  operator new[](unsigned long)-0x4 

Without -C nó sẽ hiển thị tên đọc sai _Znam.

nm cũng có tùy chọn đó.

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