Thứ Ba, 4 tháng 6, 2013

C++filt

Các ngôn ngữ cho phép function nạp chồng (overloading) phải có một cơ chế cho việc phân biệt giữa các phiên bản được nạp chồng (overfloaded versions) của một function bởi vì mỗi phiên bản có tên giống nhau. Ví dụ về C++ sau chỉ ra các prototypes cho một vài overloaded versions của một function có tên demo:

void demo(void);
void demo(int x);
void demo(double x);
void demo(int x, double y);
void demo(double x, int y);
void demo(char* str);

Theo luật chung, không thể có 2 functions với cùng một tên nằm trong một object file. Để cho phép overloading, compilers lấy các tên duy nhất cho overloaded functions bởi việc kết hợp thông tin mô tả một thứ tự các function arguments. Quá trình lấy các tên duy nhất cho các functions với các tên giống hệt nhau được gọi là name mangling. Nếu chúng ta sử dụng nm để dump các symbols từ một compiled version của đoạn code C++ phía trên. Chúng ta có thể nhìn thấy những thứ như sau :

idabook# g++ -o cpp_test cpp_test.cpp
idabook# nm cpp_test | grep demo
0804843c T _Z4demoPc
08048400 T _Z4demod
08048428 T _Z4demodi
080483fa T _Z4demoi
08048414 T _Z4demoid
080483f4 T _Z4demov

C++ không định nghĩa các chuẩn cho các cơ chế name-mangling, nó để cho compiler designers phát triển những cơ chế của họ. Để giải mã các mangled khác nhau của demo, chúng ta cần một công cụ hiểu được cơ chế name mangling của compiler của chúng ta (g++ trong trường hợp này). Đó là mục đích của c++flit . c++flit coi mỗi input word nếu nó là mangled name và sau đó cố gắng xác định compiler đã được sử dụng để sinh ra tên đó. Nếu tên xuất hiện là một mangled name hợp lệ, nó xuất ra demangled version của tên này. Khi c++flit không nhận dạng một word hay mangled name, nó đơn giản xuất ra word với ko có sự thay đổi nào.

Nếu pass kết quả của nm từ ví dụ trước vào c++flit, có khả năng khôi phục demangled function names, như ta thấy dưới đây:

idabook# nm cpp_test | grep demo | c++filt
0804843c T demo(char*)
08048400 T demo(double)
08048428 T demo(double, int)
080483fa T demo(int)
08048414 T demo(int, double)
080483f4 T demo()

Điều quan trọng cần lưu ý là mangled names chứa các thông tin bổ sung mà nm bình thường không cung cấp. Thông tin này có thể cực kỳ hữu ích trong khi ta reverse engineering, và trong nhiều trường hợp phức tạp khác, thông tin thêm này có thể bao gồm dữ liệu về class names hoặc function-calling conventions.

Không có nhận xét nào:

Đăng nhận xét