2012-07-04 27 views

Trả lời

1

Nó có nghĩa là khả năng hiển thị của biểu tượng được ẩn: https://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/CppRuntimeEnv/Articles/SymbolVisibility.html

Lý do cho việc thay đổi khả năng hiển thị các biểu tượng bao gồm:

  • Ít nguy cơ biểu tượng va chạm.
  • Các tệp nhị phân nhỏ hơn.
  • Giảm thời gian khởi động vì trình liên kết động không cần xử lý nhiều ký hiệu.
  • Cơ hội cho mã hiệu quả hơn vì trình biên dịch biết rằng một biểu tượng không thể bị ghi đè thông qua hệ thống kiểu LD_PRELOAD.
  • Ngăn phần mềm bên thứ ba gọi vào API không có giấy tờ.

Xem http://www.gnu.org/software/gnulib/manual/html_node/Exported-Symbols-of-Shared-Libraries.html để biết thêm thông tin.

+0

Tôi đang sử dụng thư viện để liên kết tĩnh thực thi của mình. Vấn đề là tôi có biểu tượng ở trên được định nghĩa trong hai libs khác nhau, cả hai đều bị ẩn. Liên kết không thành công do các biểu tượng trùng lặp. Khi tôi hiểu bạn một cách chính xác, điều đó không nên xảy ra, phải không? – MBober

+3

@MBober: Không, chính xác cho trình liên kết tạo ra lỗi trong trường hợp đó. Hãy nhớ rằng một thư viện tĩnh về cơ bản là một kho lưu trữ các tệp đối tượng mà tất cả đều trở thành đầu vào cho trình liên kết khi thư viện tĩnh được liên kết. Biểu tượng hiển thị ảnh hưởng đến đầu ra của trình liên kết (thư viện thực thi hoặc động), nhưng bạn vẫn sẽ có mối liên kết vấn đề nếu hai hoặc nhiều tệp đối tượng xác định cùng một biểu tượng. –

1

Một liên kết mà giải thích visibility support (đối với gcc)

Từ liên kết:

  • Nó cải thiện rất đáng kể thời gian tải của (Shared Object động) DSO của bạn. Ví dụ, một thư viện dựa trên mẫu C++ rất lớn đã được kiểm tra (thư viện kết buộc TnFOX Boost.Python) hiện tải trong tám giây thay vì hơn sáu phút!

  • Nó cho phép trình tối ưu hóa tạo mã tốt hơn. PLT indirections (khi một cuộc gọi hàm hoặc truy cập biến phải được tra cứu thông qua Bảng bù đắp toàn cầu như trong mã PIC) có thể tránh được hoàn toàn, do đó đáng kể tránh các quầy hàng trên các bộ xử lý hiện đại và mã nhanh hơn nhiều. Hơn nữa khi hầu hết các biểu tượng bị ràng buộc cục bộ, chúng có thể được xóa bỏ hoàn toàn một cách an toàn thông qua toàn bộ DSO. Điều này cung cấp cho vĩ độ lớn hơn đặc biệt là inliner mà không còn cần phải giữ một điểm vào xung quanh "chỉ trong trường hợp".

  • Nó giảm kích thước DSO của bạn xuống 5-20%. Định dạng bảng biểu tượng xuất khẩu của ELF khá là một khoảng trống, cho biết tên biểu tượng bị xáo trộn hoàn chỉnh với việc sử dụng mẫu nặng có thể trung bình khoảng 1000 byte. Các mẫu C++ phun ra một số lượng lớn các ký hiệu và một thư viện C++ điển hình có thể dễ dàng vượt qua 30.000 ký hiệu khoảng 5-6Mb! Vì vậy nếu bạn cắt ra 60-80% các ký hiệu không cần thiết, DSO của bạn có thể nhỏ hơn megabyte!

  • Cơ hội va chạm biểu tượng thấp hơn nhiều. Sự khốn khổ cũ của hai thư viện trong nội bộ bằng cách sử dụng cùng một biểu tượng cho những thứ khác nhau cuối cùng là đằng sau chúng tôi với miếng vá này. Hallelujah!

Mặc dù thư viện được trích dẫn ở trên là trường hợp cực đoan, hỗ trợ hiển thị mới đã giảm biểu tượng được xuất từ> 200.000 ký tự xuống dưới 18.000. Một số 21Mb đã bị loại ra kích thước nhị phân là tốt!

A usage sample and also potential pitfall khi sử dụng thuộc tính visibilty

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