2012-01-26 20 views
8

Giả sử tôi có hai thư viện tĩnh không được xây dựng bởi tôi và tôi không có quyền kiểm soát nội dung của chúng.Ngăn nhập chức năng từ thư viện tĩnh

Thư viện 1 có chức năng:

A() 
B() 
C() 

Thư viện 2 có chức năng:

A() 
D() 
E() 

Cả hai cần phải được liên kết vào một ứng dụng gọi điện thoại nhưng sự trùng tên của A() ném lỗi.

Có cách nào để nói "Bỏ qua A() từ Thư viện 1 khi liên kết" trong linux bằng gcc và ld.

+0

Có thể đáng nhắc đến chuỗi công cụ của bạn. Thông thường, GNU gcc và ld? – Thomas

+0

Đã thêm, nó nằm trong GCC và ld. – tpg2114

Trả lời

6

Có một vài phương pháp mà tôi biết:

  1. Bạn có thể tạo một bản sao của thư viện trong đó có các biểu tượng có liên quan ẩn, và liên kết chống lại bản sao. Bạn không cần quyền truy cập vào bất kỳ nguồn nào cho mã thư viện để thực hiện việc này: objcopy có thể làm điều đó với tùy chọn --localize-symbol. Tôi mô tả cách thực hiện điều này với các tệp .o trong this answer cho một câu hỏi tương tự, nhưng cùng một phương thức hoạt động tốt với các thư viện .a.

  2. Có thể sử dụng --allow-multiple-definition option. (Nếu bạn đang liên kết thông qua lệnh gcc, thay vì trực tiếp với ld, bạn cần phải chỉ định tùy chọn là -Wl,--allow-multiple-definition.) Điều này sẽ làm cho trình liên kết ngừng quan tâm đến nhiều định nghĩa và chỉ cần sử dụng lệnh đầu tiên gặp thay vì - vì vậy bạn phải cẩn thận thứ tự các thư viện xuất hiện trên dòng lệnh. Nhược điểm nó là một lựa chọn toàn cầu, vì vậy nếu bạn có các xung đột biểu tượng không mong muốn khác, nó có thể làm điều sai trái thay vì nói với bạn về nó.