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 đặt tất cả để hoạt động. Dưới đây là ngữ cảnh:Linux, GNU GCC, ld, tập lệnh phiên bản và định dạng nhị phân ELF - Cách thức hoạt động?
- Tôi có hai phiên bản của thư viện động hiển thị cùng một bộ giao diện, giả sử libsome1.so
và libsome2.so
.
- Đơn đăng ký được liên kết với libsome1.so
.
- Ứng dụng này sử dụng libdl.so
để tải động mô-đun khác, giả sử libmagic.so
.
- Hiện tại libmagic.so
được liên kết với libsome2.so
. Rõ ràng, không sử dụng các kịch bản liên kết để ẩn các ký hiệu trong libmagic.so
, tại thời gian chạy tất cả các cuộc gọi đến các giao diện trong libsome2.so
được giải quyết thành libsome1.so
. Điều này có thể được xác nhận bằng cách kiểm tra giá trị trả về bởi libVersion()
so với giá trị của macro LIB_VERSION
.
- Vì vậy, tôi cố gắng 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 biểu tượng ngoại trừ 3 được xác định trong 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
giá trị khớp với (và báo cáo phiên bản 2 không 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 liên kết mềm ở vị trí của nó để trỏ đến libsome2.so
, mọi thứ hoạt động như mong đợi và tham nhũng tương tự sẽ không xảy ra.
Tôi không thể không nghĩ rằng điều này có thể gây ra do xung đột về độ phân giải của các liên kết thời gian chạy của biểu tượng. Tôi đã thử nhiều thứ, giống như cố gắng liên kết libsome2.so
để tất cả các biểu tượng được chuyển thành [email protected]@VER_2
(mà tôi vẫn nhầm lẫn vì lệnh nm -CD libsome2.so
vẫn liệt kê các biểu tượng là symbol
và không [email protected]@VER_2
) ... Không có gì có vẻ hiệu quả !!! Cứu giúp!!!!!!
Chỉnh sửa: Tôi nên đề cập trước đó, nhưng ứng dụng được đề cập là Firefox và libsome1.so
là libsqlite3.so
được vận chuyển cùng với nó. Tôi hoàn toàn không có tùy chọn biên dịch lại chúng. Ngoài ra, việc sử dụng các tập lệnh phiên bản để ẩn các biểu tượng có vẻ là giải pháp duy nhất ngay bây giờ. Vậy điều gì thực sự xảy ra khi biểu tượng bị ẩn? Họ có trở thành 'cục bộ' với SO không? Liệu rtld không có kiến thức về sự tồn tại của họ? Điều gì xảy ra khi hàm được xuất hiện đề cập đến một biểu tượng ẩn?
Bạn đã thử tại http://unix.stackexchange.com/? – joksnet
@joksnet: Tôi nghĩ stackexchange là dành cho người dùng chứ không phải là nhà phát triển ... Câu hỏi này có liên quan đến sự phát triển trong C++ Linux ... Hay tôi chỉ bị lừa? :) Chỉnh sửa: Tôi sai! Đối với một số lý do tôi nghĩ stackexchange = serverfault !! Tôi không biết unix.stackexchange.com !! – themoondothshine
Có! Bởi vì nó vẫn còn trên bản beta, và không có tên miền riêng. – joksnet