Linux'ta kütüphane sürümlemesi ve bunların nasıl işe yarayacağı hakkında daha fazla bilgi edinmeye çalışıyorum. Bağlam şöyledir:
- Dinamik bir kütüphanenin aynı arayüz setini ortaya koyan iki versiyonum var, diyelim libsome1.sove libsome2.so.
- Bir uygulamaya bağlı libsome1.so.
- Bu uygulama, libdl.sodinamik olarak başka bir modül yüklemek için kullanır diyelim libmagic.so.
- Şimdi libmagic.sobağlandı libsome2.so. Açıkçası, sembolleri gizlemek için bağlayıcı komut dosyaları kullanılmadan libmagic.so, çalışma zamanında içindeki arabirimlere yapılan tüm çağrılar libsome2.soçözülür libsome1.so. Bu, döndürülen libVersion()değeri makronun değerine göre kontrol ederek onaylanabilir LIB_VERSION.
- Bu yüzden derlemek ve libmagic.sotanımlanmış libmagic.sove onun tarafından ihraç 3 dışında tüm sembolleri gizleyen bir linker komut dosyası ile bağlantı deneyin . Bu eserler ... Veya en azından libVersion()ve LIB_VERSIONdeğerler maç (ve sürüm 2 değil 1 bildiriyor).
- Ancak, bazı veri yapıları diske serileştirildiğinde, bazı bozulmalar olduğunu fark ettim. Uygulamanın dizininde, silmek libsome1.sove yerine işaret etmek için yumuşak bir bağlantı oluşturursam libsome2.so, her şey beklendiği gibi çalışır ve aynı bozulma gerçekleşmez.
Yardım edemiyorum ama bunun çalışma zamanı bağlayıcısının sembollerin çözünürlüğündeki bazı çatışmalardan kaynaklanabileceğini düşünüyorum. Ben libsome2.so, tüm semboller symbol@@VER_2(böylece hala nm -CD libsome2.sohala semboller listelemek symbolve listelemek değil çünkü hakkında hala kafam karıştı) için bağlanmış olmaya çalışıyorum gibi birçok şey denedim symbol@@VER_2... Hiçbir şey çalışmıyor gibi görünüyor !!! Yardım!!!!!!
RTLD_LOCALve RTLD_DEEPBINDUygulamada Dlopen bayrakları. Bunu şimdi test etmek için zamanım yok ama manpage temelinde çalışmalı.