2010-03-03 22 views
6

Tôi nhận thấy rằng khi tôi liên kết một tệp thực thi với một thư viện tĩnh (.a), các ký hiệu từ thư viện tĩnh sẽ được xuất ra bởi tệp thi hành. Tôi muốn tránh điều này và không xuất khẩu gì cả.Tránh xuất khẩu các ký hiệu từ các tập tin thực thi trên Linux

Tôi đã thử cung cấp tập lệnh phiên bản, nhưng dường như không có sự khác biệt. Nội dung của tập lệnh phiên bản của tôi như sau:

{ 
    global: 
     main; 
    local: 
     *; 
}; 

Có cách nào để không xuất ký hiệu từ tệp thực thi khi liên kết trong thư viện tĩnh không? Tôi không thể biên dịch lại thư viện tĩnh.

Trả lời

7

chương trình chạy không xuất khẩu những biểu tượng theo mặc định và sẽ không làm như vậy, trừ khi bạn sử dụng -Wl, - xuất khẩu năng động. Điều này chỉ cần thiết nếu bạn đang tự động tải các thư viện cần tự liên kết vào các biểu tượng trong tệp thực thi chính (đây là trường hợp phổ biến trong C++ nếu các thư viện của bạn chứa các lớp ghi đè các phương thức ảo trong exe)

Có lẽ bạn ' tái gây nhầm lẫn các biểu tượng xuất khẩu có biểu tượng gỡ lỗi. Các biểu tượng gỡ lỗi sẽ được tạo ra vì lợi ích của trình gỡ lỗi (nếu bạn không loại bỏ các exe), nhưng không bắt buộc phải chạy.

+1

Có vẻ như gcc 4.8.2 (trên Linux vòm) xuất hiện tên chức năng exec theo mặc định, sự kiện if -fvisibility = hidden được sử dụng. Và chỉ thêm -s để linker loại bỏ các biểu tượng. – aisbaa

3

Sử dụng strip?

$ man strip

+0

Dải sẽ không dừng các biểu tượng xuất có thể thực thi được, nếu thực sự có, vì nó chỉ mất thông tin gỡ lỗi. – MarkR

+1

@MarkR: đọc trang hướng dẫn cho dải - nó có thể loại bỏ nhiều hơn chỉ là các biểu tượng gỡ lỗi –

+0

Nhưng nếu bạn loại bỏ các phần được yêu cầu để chạy, thì nhị phân sẽ không chạy nữa, rõ ràng là :) – MarkR

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