2009-04-27 24 views
7

Trên Linux với chuỗi công cụ GNU, tôi biết cách kiểm soát các ký hiệu đã xuất từ ​​thư viện được chia sẻ với tập lệnh phiên bản (gcc -Wl, - version-script = symbols.map), nhưng tôi muốn liệt kê các ký hiệu đã xuất trên dòng lệnh thay thế. IOW, tôi muốn tương đương vớiTrình liên kết GNU: thay thế cho --version-script để liệt kê các biểu tượng đã xuất tại dòng lệnh?

link /EXPORT:foo 

từ chuỗi công cụ MS. Có thể không?

EDIT:

Câu hỏi của tôi có thể không rất clearn: nếu tôi có một libfoo.so thư viện, và tôi muốn chỉ thư viện xuất khẩu foo1 và foo2, tôi có thể đi tạo ra một phiên bản foo.linux kịch bản như sau

libfoo.so 
{ 
global: 
    foo1; 
    foo2; 
local: 
    *; 
} 

Và đừng

gcc -shared foo.c -Wl,--version-script=foo.linux -o libfoo.so -soname libfoo.so 

tôi muốn để có thể làm điều gì đó như thế này thay vì:

gcc -shared foo.c -Wl,--export-symbol=foo1 -Wl,--export-symbol=foo2 -o libfoo.so -soname libfoo.so 

Trả lời

3

Tôi không chắc chắn rằng bạn có thể thực hiện việc này như bạn muốn. Một cách là với tập lệnh phiên bản trình liên kết như bạn đã đề cập. Một cách khác là thêm mã nguồn của bạn __attribute__ ((visibility("default"))) cho bất kỳ thứ gì bạn muốn xuất và biên dịch mọi thứ với -fvisibility=hidden

+0

Yep, dường như làm những gì tôi muốn chỉ đơn giản là không thể vào lúc này. Sử dụng thuộc tính là chính xác những gì tôi muốn tránh –

-1

đọc và objdump có nhiều tùy chọn. Cách thực hiện:

readelf --symbols --use-dynamic $yourlib.so 
0

Tôi có thể trễ tám năm, nhưng có, bạn thực sự có thể làm những gì bạn muốn.

Sử dụng Bash process substitution:

gcc -shared foo.c -Wl,--version-script=<(echo "{global:foo1;foo2;local:*;};") -o libfoo.so -soname libfoo.so 
Các vấn đề liên quan