2009-10-01 19 views
9

Tôi đã tạo một thư viện tĩnh trong GCC, nhưng tôi muốn ẩn hầu hết các ký hiệu.Với GCC, làm thế nào để tôi chỉ xuất các hàm nhất định trong một thư viện tĩnh?

Ví dụ, test1.c:

extern void test2(void); 
void test1(void) { 
    printf("test1: "); 
    test2(); 
} 

test2.c:

extern void test1(void); 
void test2(void) { 
    printf("test2\n"); 
} 

library_api.c:

extern void test1(void); 
extern void test2(void); 
void library_api(void) { 
    test1(); 
    test2(); 
} 

Bây giờ biên dịch với:

gcc -c test1.c -o test1.o 
gcc -c test2.c -o test2.o 
gcc -c library_api.c -o library_api.o 
ar rcs libapi.a test1.o test2.o library_api.o 

Làm thế nào để tôi nhận được chỉ là "library_api()" chức năng để hiển thị lên cho:

nm libapi.a 

thay vì chức năng "test1()", "test2()", và "library_api()"? Nói cách khác, làm thế nào để ẩn "test1()" và "test2()" hiển thị và được gọi cho người dùng bên ngoài libapi.a? Tôi không muốn người dùng bên ngoài biết bất cứ điều gì về chức năng kiểm tra nội bộ.

Trả lời

9

Giải pháp đơn giản nhất là #include test1.c và test2.c thành library_api.c và chỉ biên dịch tệp đó. Sau đó, bạn có thể tạo test1() và test2() tĩnh.

Hoặc, bạn có thể kết hợp các tệp đối tượng với ld -r và sử dụng objcopy --localize-symbols để làm cho các hàm thử nghiệm tĩnh sau khi liên kết. Vì điều này có thể khá tẻ nhạt, tôi thực sự khuyên bạn nên chọn tùy chọn đầu tiên.

+0

Khai báo biểu tượng 'tĩnh' cũng không giúp ẩn nó trong thư viện tĩnh. –

+1

@Pavel: chắc chắn rồi. Bạn không thể liên kết với một biểu tượng tĩnh; nếu muốn, bạn cũng có thể loại bỏ tất cả các ký hiệu tĩnh sau khi biên dịch. –

+0

Tôi đã thử "ld -r --retain-symbols-file tmp.list test1.o test2.o library_api.o -o libapi.a" trong đó tmp.list chỉ chứa "library_api" và "nm libapi.a" vẫn hiển thị các ký hiệu test1 và test2 là toàn cầu. Bất kỳ ý tưởng? – Will

2

ld có quyền lựa chọn

--retain-ký-file FILE Chỉ giữ lại những biểu tượng được liệt kê trong FILE

để cho phép bạn đặt tên một cách rõ ràng những biểu tượng bạn muốn giữ.

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