2015-08-30 13 views
5

foo kod adlı bir programım var. foo, common.so'a bağlıdır ve normal yolla bağlantılıdır (özür dilerim, teknik olarak bunu söylemiyorum). foo çalıştığında,'yi dlopen() kullanarak dinamik olarak yükler. Çok uzak çok iyi. Ayrıca, bar.so, () dlopen()common.so yeniden yüklenir mi (okuduğumdan itibaren bağımlılık gerektiren her şeyi tekrarlı olarak yükler), yoksa yüklü olduğunu algılar mı? Yeniden yüklerse, bu programımda sorunlara neden olabilir mi? foo ve bar.so öğelerinin her ikisi de common.so'daki değişiklikleri burada statik değişkenler haline getirecek şekilde görmelidir.Dlopen yeniden yüklemesi zaten yüklenmiş bağımlılıklar var mı? Eğer öyleyse, etkileri nelerdir?

Belki de tasarımımın değiştirilmesi veya -rdynamic kullanımını gerektirmesi gerekiyor (ki bu da henüz tam olarak doğru şekilde anlamadığım)?

cevap

2

POSIX spec for dlopen() diyor ki: dlopen bile

Sadece yürütülebilir bir nesne dosyasının bir tek kopya yürütülebilir nesne dosyaya referans birden çok kez çağrılır(), içine adres boşluğu getirilmeli ve çalıştırılabilir nesne dosyasına başvurmak için farklı yol adları kullanılsa bile.

Linux'ta, bu bir referans sayısı kullanılarak uygulanır; dlclose'a eşit sayıda çağrılana kadar, paylaşılan nesne yerleşik olarak kalacaktır.

[güncelleme]

Sana örtülü bağımlılıkları olarak yüklenen paylaşılan nesneler hakkında soruyorsunuz farkındayım ama aynı ilke geçerlidir. Aksi takdirde, pek çok şey kırılırdı ... Özellikle, ortak nesnedeki küresel kurucular birden çok kez koşarlardı ki bu da hasara yol açabilirdi.

+0

Teşekkürler :) Onların kendi izole kopyalarına sahip olduklarına veya böyle saçmalıklara sahip olabileceklerinden endişeliydim. Merak ettim, bunun yerine "ortak" olsaydı ne olacağını biliyor musun? –

+0

İyi soru ... Benim tahminim "kötü şeyler" olurdu, ama aslında emin değilim. – Nemo

+0

Evet, kötü şeyler de düşündüğüm şey ... Aslında bunu ilk başta yapıyordum. '-dynamic' kullanmam gerekiyordu, aksi halde birbirlerinin değişimlerini göremedikleri ortaya çıktı. –

İlgili konular