2012-07-04 18 views
39

Tôi có lệnh c++filt để hủy bỏ một biểu tượng, công cụ để làm ngược lại và mangle một tên biểu tượng là gì?Tiện ích Linux để mangle một tên biểu tượng C++ là gì?

Điều này sẽ hữu ích nếu tôi muốn gọi dlsym() trên tên chức năng C++ bị xé. Tôi không muốn mã cứng tên mangling trong mã kể từ khi nó có thể thay đổi theo thời gian do phiên bản mới complier hoặc thương hiệu trình biên dịch mới đang được sử dụng hoặc hiện tại do biên dịch cho nhiều nền tảng.

Có cách nào có lập trình để lấy chuỗi đại diện cho hàm C++ khi chạy để mã độc lập không? Một cách để có thể làm điều này là gọi một tiện ích tại thời gian biên dịch thực hiện tên mangling cho trình biên dịch đang được sử dụng và chèn tên biểu tượng C++ xâu thích hợp vào một chuỗi cho dlsym() để sử dụng.

Here is the closest to a solution I've found on this site được thực hiện bằng cách sử dụng tên kiểu C cố định để gián tiếp tới biểu tượng C++ được xác định trong thư viện bạn muốn dlsym(), nhưng nếu bạn không có quyền kiểm soát thư viện đó cung cấp thì đây không phải là tùy chọn.

+13

Mọi người đều sử dụng trình biên dịch C++ cho tên mangle. –

+2

Làm thế nào về, uh, trình biên dịch? –

+1

-1, trình biên dịch là thứ duy nhất bạn cần ... và đó là câu trả lời khá rõ ràng. – Griwes

Trả lời

3

Bạn có thể có được những gì bạn muốn bằng cách nhìn vào bảng biểu tượng của .so bạn đang xem xét: Một người khác đã trả lời câu hỏi này là Returning a shared library symbol table.

Tuy nhiên, nếu có quá nhiều ký hiệu ... có thể không hoạt động.
Vì vậy, đây là một ý tưởng điên rồ. Emptor caveat!

Một giải pháp tiềm năng là:

  1. tạo ra một tập tin với một cuống với chính xác một tên: tên mà bạn muốn: void myfunction() {}

  2. biên dịch tập tin đó (với - fPIC và -shared nên đó là một thư viện động)

  3. gọi dlopen/dlsym vào đó tập tin cụ thể

  4. Lặp xuyên ugh các biểu tượng (chỉ nên chỉ có một muốn cộng với rác thường xuyên khác bạn có thể lọc). Lặp lại thông qua những biểu tượng là vụng về, nhưng bạn có thể làm điều đó: Returning a shared library symbol table

  5. dlclose() để giải phóng nó lên (mất cuống ra các biểu tượng của bạn)

  6. mở tập tin mà bạn muốn với dlopen

về cơ bản, bạn sẽ gọi trình biên dịch từ mã của bạn, nó sẽ tạo ra một .so bạn có thể nhìn vào, có được giá trị chỉ ra, sau đó dỡ bỏ mà .so vì vậy bạn có thể tải tại nơi mà bạn muốn.

Thật điên rồ.

3

Việc xén tên là triển khai cụ thể.

Không có tiêu chuẩn cho tên mangling vì vậy tốt nhất bạn nên tìm một trình biên dịch để làm điều đó cho bạn.

Name mangling

Có một bảng ở đây có thể giúp bạn nếu bạn muốn làm điều này bằng tay

5

Đó là cách g ++ mangles tên. Bạn có thể thực hiện những quy tắc mangling trên chương trình của bạn.

Giải pháp khác (điên) là liệt kê tất cả các ký hiệu trong thư viện bạn muốn sử dụng (nó không quá khó nếu bạn hiểu định dạng), loại bỏ tất cả và tìm kiếm tên hàm của bạn trong danh sách đó. Ưu điểm của phương pháp này là việc xử lý demangling dễ dàng hơn, vì có một lời gọi hàm để làm điều đó: abi::__cxa_demangle, từ tiêu đề cxxabi.h.

+0

bị hỏng! Tôi tìm thấy tài liệu tham khảo này: http://refspecs.linuxbase.org/cxxabi-1.83.html#mangling – fonini

0

Một phương pháp dễ dàng hơn so với lần đăng đầu tiên. Viết một chút C++ chương trình như:

#include <stdlib.h> 

extern int doit(const char *toto, bool is); 

int main(int argc, char *argv[]) 
{ 
    exit(doit (argv[0], true)); 
} 

Xây dựng nó với

# g++ -S test.cpp 

Và trích xuất tên biểu tượng từ nguồn lắp ráp

# cat test.s | grep call | grep doit | awk '{print $2}' 

Bạn nhận:

[email protected]:/tmp/TestC++$ cat test.s | grep call | grep doit | awk '{print $2}' 
_Z4doitPKcb 
[email protected]:/tmp/TestC++$ 

Các doit biểu tượng bị xén là _Z4doitPKcb Sử dụng trình biên dịch bạn định sử dụng vì mỗi trình biên dịch có quy tắc mang tên riêng của nó (như đã được nói trước đó từ trình biên dịch này sang trình biên dịch khác có thể thay đổi).

Hãy vui vẻ!

+0

Bởi vì người khiếu nại có thể thay đổi, câu hỏi đang yêu cầu một cách trong thời gian chạy để tính toán động này. – WilliamKF

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