2012-01-09 14 views
5

Đây là vấn đề:Trong GCC, làm cách nào tôi có thể xuất tất cả các biểu tượng typeinfo cho một thư viện được chia sẻ mà không xuất tất cả các ký hiệu?

Tôi có thư viện được chia sẻ ẩn biểu tượng theo mặc định. Trên thực tế, nó sử dụng tùy chọn -Xlinker --version-script = để xuất một số biểu tượng trong một tệp cụ thể nhưng ẩn tất cả các phần còn lại. Vấn đề là nếu chúng ta cố gắng nắm bắt các ngoại lệ đã được định nghĩa trong các thư viện chia sẻ khác, chúng ta sẽ gặp vấn đề bởi vì typeinfo bị ẩn bởi thư viện chia sẻ này. Tôi không thể hiển thị rõ ràng các lớp ngoại lệ vì chúng được định nghĩa trong một thư viện nguồn mở nằm ngoài tầm kiểm soát của tôi. Tôi cũng không muốn liệt kê một cách rõ ràng các tên bị xáo trộn cho typeinfo của các lớp ngoại lệ trong tệp biểu tượng phiên bản script vì có nhiều nhà phát triển làm việc trên thư viện này và họ nhất định quên làm điều này cho một số lớp ngoại lệ trong Tương lai.

Tôi đã thử sử dụng tính năng tăng cường khả năng hiển thị #pragma GCC (mặc định) trước tệp .hpp nguồn mở nhưng dường như không hoạt động - biểu tượng không hiển thị.

Tôi cũng đã thử sử dụng tính năng -fvisibility-ms-compat đã xuất các ký hiệu typeinfo nhưng cũng xuất các tấn ký hiệu khác mà tôi không muốn xuất. Thư viện có cả mã C và C++ trong nó vì vậy tôi không chắc làm thế nào nó được cho là làm việc với tùy chọn này chỉ dành cho C++.

Điều tôi thực sự cần là một tùy chọn sẽ làm cho tất cả các biểu tượng typeinfo hiển thị, trong khi để lại các ký hiệu khác ẩn (trừ khi chúng hiển thị rõ ràng). Có một lựa chọn như thế này không?

+0

Có thể tạo ra một kịch bản linker động bằng cách xử lý đầu ra của ' nm' hoặc một cái gì đó như thế? Chỉ cần đoán thôi. –

+0

Đó có thể là một cách tốt để đi. Tôi đã nghĩ về nó và mặc dù tôi không thích công việc kịch bản thêm nó sẽ mang nó có thể là câu trả lời tốt nhất. Cảm ơn bạn đã đề xuất! –

Trả lời

2

Câu trả lời trực tiếp nhất cho câu hỏi của bạn là thử tùy chọn ld --dynamic-list-cpp-typeinfo. Tôi đã không có may mắn nhất với tùy chọn đó, nhưng YMMV.

Bạn không nói bạn đang xây dựng nền tảng nào. Chắc chắn bạn đang sử dụng mingw, vì bạn đã thử -fvisibility-ms-compat; nhưng trong cơ hội tự tay rằng bạn đang thực sự nhắm mục tiêu ELF như Linux, hãy thử xuất khẩu các ký hiệu đại diện biểu tượng _ZTI*_ZTN* từ tập lệnh phiên bản của bạn. (Bạn có thể có thể làm một cái gì đó tương tự trên Windows, nhưng trong phạm vi như Visual C++ tên mangling không thực sự tài liệu, tôi không biết bất kỳ ký tự đại diện đóng hộp bạn có thể sử dụng.)

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