soname được sử dụng để cho biết khả năng tương thích nhị phân api của thư viện của bạn.
SONAME
được sử dụng tại thời gian biên dịch bởi trình liên kết để xác định từ tệp thư viện phiên bản thư viện đích thực sự. gcc -l NAME
sẽ tìm kiếm lib NAME
.so liên kết hoặc tệp sau đó chụp SONAME của nó chắc chắn sẽ cụ thể hơn (ví dụ: libnuke.so liên kết tới libnuke.so.0.1.4 chứa SONAME libnuke.so.0).
Khi chạy, nó sẽ liên kết với điều này sau đó được đặt thành phần động ELF NEEDED
, khi đó thư viện có tên này (hoặc liên kết đến nó) sẽ tồn tại. Tại thời gian chạy SONAME
không được chú ý, do đó chỉ có liên kết hoặc tồn tại tệp là đủ.
Lưu ý: SONAME chỉ được thực thi tại thời gian liên kết/xây dựng chứ không phải lúc chạy.
'SONAME' của thư viện có thể xem bằng 'tệp objdump -p | grep SONAME'. 'CẦN' của tệp nhị phân có thể được xem bằng 'tệp objdump -p | grep NEEDED'.
[EDIT] CẢNH BÁO Sau đây là nhận xét chung, không phải là nhận xét được triển khai trong linux. Xem ở cuối.
Giả sử bạn có một thư viện với tên libnuke.so.1.2 và bạn phát triển một thư viện libnuke mới:
- nếu thư viện mới của bạn là một sửa chữa từ trước đó mà không thay đổi api, bạn nên chỉ cần giữ cùng soname , tăng phiên bản của tên tập tin. tức là tập tin sẽ là libnuke.so.1.2.1 nhưng soname vẫn sẽ là libnuke.so.1.2.
- nếu bạn có thư viện mới chỉ thêm chức năng mới nhưng không phá vỡ chức năng và vẫn tương thích với trước đó bạn muốn sử dụng cùng một tên son hơn trước đó cộng với hậu tố mới như .1. tức là tập tin và soname sẽ là libnuke.so.1.2.1. Bất kỳ chương trình nào được liên kết với libnuke.1.2 sẽ vẫn hoạt động với chương trình đó. Các chương trình mới được liên kết với libnuke.1.2.1 sẽ chỉ hoạt động với chương trình đó (cho đến khi phiên bản lật đổ mới xuất hiện như libnuke.1.2.1.1).
- nếu thư viện mới của bạn không tương thích với bất kỳ libnuke: libnuke.so.2
- nếu thư viện mới của bạn tương thích với phiên bản cũ: libnuke.so.1.3 [ie vẫn tương thích với libnuke.so.1]
[EDIT] để hoàn tất: trường hợp linux.
Trong linux SONAME cuộc sống thực như một hình thức cụ thể:. lib [NAME] [API-VERSION] .so [chính-version] lớn phiên bản chỉ có một giá trị số nguyên tăng với mỗi thay đổi thư viện lớn. API-VERSION trống theo mặc định
cũ libnuke.so.0
Sau đó filename thực bao gồm phiên bản nhỏ và subversions ví dụ: libnuke.so.0.1.5
Tôi nghĩ rằng không cung cấp một soname là một hành động không tốt kể từ khi đổi tên tệp sẽ thay đổi hành vi của tệp.
Nguồn
2013-01-30 20:56:05
Philippe, theo David A. Wheeler (http://bit.ly/1CkQJmR), các soname có một số phiên bản duy nhất, như libnuke. so.1 hoặc libnuke.so.4. Bạn có biết nếu một số phiên bản thứ hai thực sự có thể là một phần của soname, như libnuke.so.1.2? –
Vâng, sonmae với nhiều chữ số tồn tại, ví dụ cho thư viện openssl: SONAME: libssl.so.0.9.8, nhưng bạn nói đúng hơn là tổng quát hơn "Program Library HOWTO" là debian có vẻ hạn chế hơn thực sự –
Bạn có vẻ để được mô tả rằng tên tập tin và soname nên được thiết lập khác nhau nhưng bạn không mô tả cách soname nên được thiết lập trong các trường hợp sau này. – poolie