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.so
ve libsome2.so
.
- Bir uygulamaya bağlı libsome1.so
.
- Bu uygulama, libdl.so
dinamik olarak başka bir modül yüklemek için kullanır diyelim libmagic.so
.
- Şimdi libmagic.so
bağ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.so
tanımlanmış libmagic.so
ve 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_VERSION
değ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.so
ve 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.so
hala semboller listelemek symbol
ve 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_LOCAL
ve RTLD_DEEPBIND
Uygulamada Dlopen bayrakları. Bunu şimdi test etmek için zamanım yok ama manpage temelinde çalışmalı.