2013-03-10 44 views
7

Tôi có ứng dụng mà có một hàm f1 void f1()chức năng ẩn trong C

Bên cạnh đó, tôi có một thư viện mà tôi tải sử dụng LD_PRELOAD.

Thư viện có một số tệp mã và một số tệp tiêu đề và tệp được biên dịch thành tệp .so.

Trên các tệp tiêu đề cũng sử dụng hàm có tên f1 có cùng chữ ký như trên. Mới nhất f1 chỉ được sử dụng trong thư viện. (Tôi không thể thay đổi nó thành phương pháp tĩnh)

Vấn đề là khi tôi tải thư viện (sử dụng LD_PRELOAD) f1 từ thư viện ghi đè f1 của ứng dụng.

Có cách nào để định cấu hình f1 thư viện chỉ hiển thị với thư viện không?

+2

Có lý do nào khiến bạn không thể đổi tên một trong các khai báo hàm không? Tôi đoán đây là trong một codebase hiện có mà có thể là lý do tại sao bạn không thể – Bojangles

Trả lời

5

Nếu bạn có thể sửa đổi các tập tin tiêu đề ở tất cả, làm cho chức năng static để làm cho nó có thể nhìn thấy chỉ trong đơn vị biên soạn, hoặc đánh dấu nó với __attribute__ ((visibility ("hidden"))) (GCC chỉ) để làm cho nó có thể nhìn thấy chỉ trong thư viện đó:

__attribute__ ((visibility ("hidden"))) void f1(); 
+0

Là '__attribute__ ((hiển thị (" ẩn ")))' macro thay thế bằng static **? ** hoặc nó hoạt động như thế nào? –

+1

@GrijeshChauhan: Không, thuộc tính đó đánh dấu biểu tượng là có khả năng hiển thị ẩn. Nó chỉ hiển thị * trong thư viện chia sẻ * (loại giống như đối diện của Win32 'DLLEXPORT'). Thuộc tính hiển thị ẩn được chuyển đến và được hiểu bởi trình liên kết (trái ngược với 'static', làm cho biểu tượng về cơ bản * vô hình * đối với trình liên kết). – nneonneo

+0

Rất cảm ơn !! .. –

3

Bạn cũng có thể biên dịch thư viện của mình với -fvisibility=hidden và sử dụng rõ ràng __attribute__ ((visibility ("default"))) cho một số chức năng của thư viện cần được hiển thị.