Tôi có một ứng dụng liên kết tĩnh với phiên bản X của thư viện, libfoo, từ nhà cung cấp bên thứ ba, VENDOR1. Nó cũng liên kết với một thư viện động (được chia sẻ), libbar, từ một nhà cung cấp bên thứ ba khác, VENDOR2, liên kết tĩnh phiên bản Y của libfoo từ VENDOR1.Liên kết với nhiều phiên bản của thư viện
Vì vậy, libbar.so chứa phiên bản Y của libfoo.a và tệp thi hành của tôi có chứa phiên bản X của libfoo.a libbar chỉ sử dụng libfoo nội bộ và không có đối tượng libfoo nào được chuyển từ ứng dụng của tôi sang libbar.
Không có lỗi tại thời gian xây dựng nhưng khi chạy lỗi ứng dụng seg. Lý do dường như là phiên bản X sử dụng các cấu trúc có kích thước khác nhau mà chúng phiên bản Y và trình liên kết thời gian chạy dường như được trộn lẫn mà được sử dụng theo đó.
Cả VENDOR1 & VENDOR2 là nguồn đóng nên tôi không thể xây dựng lại chúng.
Có cách nào để xây dựng/liên kết ứng dụng của tôi sao cho nó luôn phân giải thành phiên bản X và libbar luôn giải quyết phiên bản Y và cả hai không bao giờ kết hợp?
Bạn có thể đặt ứng dụng của mình liên kết động với VENDOR1 không? –
Không theo bất kỳ cách nào là ngôn ngữ trung lập. Điều này rất cụ thể đối với trình liên kết trình biên dịch và hệ điều hành cách chúng hoạt động cùng nhau. Cách dễ nhất là gửi e-mail cho cả người bán hàng và xem cách họ giải quyết vấn đề này. –
Suy nghĩ hiện tại của chúng tôi là, trên Linux ít nhất, để sử dụng dlopen() trên libbar.so với cờ RTLD_DEEPBIND. Một khả năng khác là tách riêng các ứng dụng sử dụng libfoo.a thành thư viện được chia sẻ, libbaz.so kết thúc tốt đẹp việc sử dụng libfoo.a, sau đó có ứng dụng dlopen libbaz.so và libbar.so với RTLD_LOCAL mà chúng tôi nghĩ có thể giữ tất cả các ký hiệu trùng lặp bên trong. Điều này có thể làm việc cho Linux nhưng chúng tôi cần nó để làm việc trên Solaris, AIX & HPUX là tốt. – YerBlues