2011-11-14 31 views
6

Khi sử dụng gcc để tạo thư viện được chia sẻ, bạn có thể giới hạn mức hiển thị của các ký hiệu bằng cách sử dụng -fvisibility = hidden. Tôi cũng chỉ học được bạn có thể giới hạn khả năng hiển thị bằng cách sử dụng tùy chọn phiên bản-script để ld.phiên bản tập lệnh và hiển thị ẩn

Bây giờ tôi muốn biết liệu có thể kết hợp chúng hay không. Nói rằng tôi có một chương trình như sau:

void foobar() {} 
void say_hello() {} 

Sau đó, tôi có tập tin kịch bản phiên bản với:

{ 
    global: 
    foobar; 
} 

Và tôi biên dịch này với: -fvisibility gcc = ẩn -Wl, - version -script = test.c -shared -o libtest.so

Khi tôi chạy nm về sau này, tôi thấy rằng không có biểu tượng nào được xuất. Có anyway mà tôi có thể thiết lập khả năng hiển thị mặc định để ẩn và sử dụng phiên bản-script (hoặc cái gì khác) để xuất khẩu các biểu tượng?

Trả lời

7

Câu hỏi của bạn làm cho không có ý nghĩa: tại sao chống -fvisibility với một kịch bản mối liên kết, khi bạn có thể sử dụng kịch bản mối liên kết để xuất khẩu chính xác những gì bạn cần, và che giấu mọi thứ khác:

{ 
    global: foobar; 
    local: *; 
}; 

Cập nhật:

Bởi vì mã tôi cần phải sử dụng này trên sử dụng __attribute__((visibility("default"))) ...

Kịch bản trình liên kết hoạt động tốt với các biểu tượng được đánh dấu. Ví dụ:

// t.c 
int __attribute__((visibility("default"))) foo() { return 1; } 
int bar() { return 2; } 
int __attribute__((visibility("default"))) exported() { return 3; } 

// t.lds 
{ 
    global: exported; 
    local: *; 
}; 

gcc t.c -Wl,--version-script=t.lds -fPIC -shared -o t.so && nm -D t.so 
       w _Jv_RegisterClasses 
       w __cxa_finalize 
       w __gmon_start__ 
00000000000004f2 T exported 
+0

Vì mã tôi cần sử dụng này khi sử dụng __attribute __ ((hiển thị ("mặc định")) trong mã để đánh dấu mức hiển thị đôi khi đôi khi dựa vào tập lệnh liên kết. Cách này được xử lý ngay bây giờ chỉ là một hack khổng lồ và tôi đang cố gắng tìm ra nếu có một cách tốt hơn để làm điều đó. –

+0

Câu hỏi của bạn * vẫn * không có ý nghĩa gì. Bạn có thể muốn giải thích câu hỏi * thực * của bạn tốt hơn. –

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