2010-10-01 17 views
33

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ụ,

  1. libmy.so.1.2 (tên thật tức là file obj thực tế)
  2. libmy.so. 1 (SONAME, được nhúng trong file obj thực tế)
  3. 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?

Trả lời

38

Versioning của các đối tượng chia sẻ hoạt động như sau:

Khi bạn tạo một đối tượng chia sẻ, bạn cho nó cả một tên thật và một soname. Chúng được sử dụng để cài đặt các đối tượng được chia sẻ (mà tạo ra cả hai đối tượng và một liên kết đến nó).

Vì vậy, bạn có thể kết thúc với tình hình:

pax> ls -al xyz* 
-rw-r--r-- 1 pax paxgroup 12345 Nov 18 2009 xyz.so.1.5 
lrwxrwxrwx 1 pax paxgroup  0 Nov 18 2009 xyz.so.1 -> xyz.so.1.5 
lrwxrwxrwx 1 pax paxgroup  0 Nov 18 2009 xyz.so -> xyz.so.1 

với xyz.so.1.5 sở hữu SONAME của xyz.so.1.

Khi liên kết liên kết trong xyz.so, nó theo các liên kết đến tận xyz.so.1.5 và sử dụng SONAME của xyz.so.1 để lưu trữ trong tệp thực thi. Sau đó, khi bạn chạy tệp thực thi, nó sẽ cố gắng tải xyz.so.1 sẽ trỏ đến một xyz.so.1.N cụ thể (không nhất thiết là phiên bản 1.5).

Vì vậy, bạn có thể cài đặt xyz.so.1.6 và cập nhật liên kết xyz.so.1 để trỏ đến liên kết đó và các tệp thi hành đã được liên kết sẽ sử dụng thay thế.Một lợi thế của phương pháp nhiều lớp này là bạn có thể có nhiều thư viện có khả năng tương thích cùng tên (xyz.so.1.*, xyz.so.2.*) nhưng trong mỗi phiên bản chính, bạn có thể tự do nâng cấp chúng vì chúng được cho là tương thích.

Khi bạn liên kết thực thi mới:

  • Những liên kết với xyz.so sẽ nhận được phiên bản nhỏ mới nhất của phiên bản chính mới nhất.
  • Những người khác liên kết với xyz.so.1 sẽ nhận phiên bản nhỏ nhất mới nhất của một phiên bản chính cụ thể.
  • Những người khác liên kết với xyz.so.1.2 sẽ nhận được phiên bản nhỏ cụ thể của một phiên bản chính cụ thể.

Bây giờ hãy ghi rằng đoạn cuối cùng trong tâm trí khi chúng ta xem xét bình luận của bạn:

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.

Không, tôi không tin như vậy. soname sẽ có nhiều khả năng là libmy.so.2 để bạn có thể cập nhật nhỏ cho luồng 2.x và nhận hành vi mới nhất.

+5

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. –

+0

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

1

Tại thời điểm liên kết ứng dụng, nếu bạn chỉ định -lmy, trình liên kết sẽ tìm kiếm tệp có tên libmy.so. Nó sẽ tìm thấy tập tin này, và liên kết bạn thực thi với nó. Nếu tệp này là một liên kết tượng trưng, ​​thì ứng dụng của bạn sẽ được liên kết với mục tiêu của liên kết tượng trưng.

Thời gian liên kết ứng dụng là địa chỉ để chỉ định phiên bản thư viện động nào bạn muốn sử dụng với ứng dụng của mình.

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