Tôi là một noob về cách các thư viện được chia sẻ hoạt động trên Linux. Tôi đang cố gắng để hiểu làm thế nào để các ứng dụng giải quyết các phiên bản khác nhau của cùng một thư viện được chia sẻ tại thời gian chạy trên Linux.Ứng dụng giải quyết như thế nào với các phiên bản khác nhau của thư viện được chia sẻ trong thời gian chạy?
Theo như tôi hiểu, một thư viện chia sẻ có ba "tên", ví dụ,
- libmy.so.1.2 (tên thật tức là file obj thực tế)
- libmy.so. 1 (SONAME, được nhúng trong file obj thực tế)
- libmy.so (tên mối liên kết, cung cấp cho các mối liên kết vào thời điểm liên kết và nhúng trong thực thi)
Khi bạn cài đặt thư viện qua ldconfig, nó sẽ tạo ra symbo sau lic liên kết
- (2) => (1)
- (3) => (2)
Bây giờ cho phép nói rằng tôi biên dịch một phiên bản của cùng một thư viện với tên thật sau , libmy.so.2.0. SONAME theo hướng dẫn sẽ là libmy.so.2.0
Vào thời gian liên kết ứng dụng tên liên kết mà tôi sẽ cung cấp với cờ "-l" là gì. Theo các hướng dẫn tôi đọc (http://www.dwheeler.com/program-library/Program-Library-HOWTO/x36.htm l), nó sẽ không phải là libmy.so và nếu như vậy, làm thế nào cả hai phiên bản của tập tin obj được phân biệt?
Bạn bắt gặp tôi đang viết câu trả lời của tôi. Bây giờ tôi chỉ có thể thêm rằng nếu OP là tò mò, ông có thể kiểm tra sonames của thư viện cài đặt sẵn trên hệ thống của mình với 'readelf' như thế này:' readelf -Wa /usr/lib/libstdc++.so.6 | grep SONAME' và xem các nguyên tắc được đưa vào thực tế như thế nào. –
Có một lỗi chỉnh sửa về phía tôi, tôi thực sự có nghĩa là "libmy.so.2". Vì vậy, nếu tôi làm theo ba viên đạn một cách chính xác, trong khi liên kết với một phiên bản lớn cũ hơn, tôi chỉ có thể chỉ định SONAME tương ứng với nó. Tôi phải nói rất nhiều tài liệu trợ giúp này gây hiểu nhầm về điều này. Họ luôn thảo luận chỉ một phần về việc liên kết chống lại bản sửa đổi lớn mới nhất, mà không có đủ điều kiện rõ ràng về thực tế này. – nisah