Tôi đang cố gắng tìm hiểu thêm về phiên bản thư viện trong Linux và cách làm cho tất cả hoạt động. Đây là bối cảnh:
- Tôi có hai phiên bản của một thư viện động hiển thị cùng một bộ giao diện, nói libsome1.so
và libsome2.so
.
- Một ứng dụng được liên kết với libsome1.so
.
- Ứng dụng này sử dụng libdl.so
để tải động một mô-đun khác, nói libmagic.so
.
- Bây giờ libmagic.so
được liên kết với libsome2.so
. Rõ ràng, không sử dụng tập lệnh liên kết để ẩn biểu tượng libmagic.so
, trong thời gian chạy, tất cả các lệnh gọi đến giao diện libsome2.so
được giải quyết libsome1.so
. Điều này có thể được xác nhận bằng cách kiểm tra giá trị được trả về bằng libVersion()
giá trị của macro LIB_VERSION
.
- Vì vậy, tôi cố gắng bên cạnh biên dịch và liên kết libmagic.so
với một tập lệnh liên kết ẩn tất cả các ký hiệu trừ 3 được xác định libmagic.so
và được xuất bởi nó. Điều này hoạt động ... Hoặc ít nhất libVersion()
và LIB_VERSION
các giá trị khớp với nhau (và nó báo cáo phiên bản 2 chứ không phải 1).
- Tuy nhiên, khi một số cấu trúc dữ liệu được tuần tự hóa vào đĩa, tôi nhận thấy một số tham nhũng. Trong thư mục của ứng dụng nếu tôi xóa libsome1.so
và tạo một liên kết mềm ở vị trí của nó để trỏ đến libsome2.so
, mọi thứ sẽ hoạt động như mong đợi và tham nhũng tương tự không xảy ra.
Tôi không thể không nghĩ rằng điều này có thể được gây ra do một số xung đột trong độ phân giải biểu tượng của trình liên kết thời gian chạy. Tôi đã thử nhiều thứ, như cố gắng liên kết libsome2.so
để tất cả các biểu tượng được chỉnh sửa symbol@@VER_2
(điều mà tôi vẫn bối rối vì lệnh nm -CD libsome2.so
vẫn liệt kê các biểu tượng là symbol
và không symbol@@VER_2
) ... Dường như không có gì hoạt động !!! Cứu giúp!!!!!!
RTLD_LOCAL
và RTLD_DEEPBIND
dlopen trong ứng dụng của bạn. Tôi không có thời gian để kiểm tra điều này ngay bây giờ nhưng nó sẽ hoạt động dựa trên trang chủ.