Statik bağlama ve dinamik bağlama


399

Dinamik bağlantı üzerinden statik bağlantı veya belirli durumlarda tam tersini seçmek için zorlayıcı performans nedenleri var mı? Aşağıdakileri duydum veya okudum, ancak konunun doğruluğu için kefil olacak kadar bilmiyorum.

1) Statik bağlama ile dinamik bağlama arasındaki çalışma zamanı performansındaki fark genellikle önemsizdir.

2) (1), program hotpath'lerini optimize etmek için profil verilerini kullanan bir profil oluşturma derleyicisi kullanıldığında doğru değildir, çünkü statik bağlantı ile derleyici hem kodunuzu hem de kütüphane kodunu optimize edebilir. Dinamik bağlantı ile sadece kodunuz optimize edilebilir. Çoğu zaman kütüphane kodunu çalıştırmak için harcanıyorsa, bu büyük bir fark yaratabilir. Aksi takdirde, (1) hala geçerlidir.


59
"Statik bağlama ile, derleyici .. kütüphane kodunu optimize edebilir" ama sadece bunu derlerse! Önceden derlenmiş nesne dosyalarına bağlanırsanız, derleyiciniz bunları optimize etme şansına sahip olmaz.

3
Bu doğruysa, o zaman haklısınız, ancak modern derleyicilerle bunun ne kadar doğru olduğuna dair bir soru var, birisi bunu şu şekilde doğrulayabilirse, bu harika olurdu.
Eloff

5
Yerel koda derleyen bir derleyici ile (çoğu C / C ++ derleyicisi gibi) kod optimizasyonu için başka şans yoktur. Kod bir ara dile (.Net IL gibi) derlenmişse, kütüphane yerel koda derlemek üzere yüklenirken JIT derleyicisi çağrılır. JIT derleyicisi geliştikçe bu son derleme zamanla daha da iyileşebilir.
Tarydon

3
@Eloff: VS2008, LTCG etkinken tam olarak bunu yapar. (Ancak lib dosyaları çok büyük olur ..) Onunla oynadım ve "derleyicimin benim için ne yapabilir" ile ilgilenen biri için, şaşırtıcı bir şey yok.
peterchen

Yanıtlar:


348
  • Dinamik bağlantı toplam kaynak tüketimini azaltabilir (birden fazla işlem aynı kitaplığı paylaşıyorsa (tabii ki "aynı" daki sürüm dahil)). Bence bu, onu birçok ortamda varlığına iten argüman. Burada "kaynaklar" disk alanı, RAM ve önbellek alanını içerir. Tabii ki, dinamik linker yeterince esnek değilse DLL cehennem riski vardır .
  • Dinamik bağlantı, hata düzeltmelerinin ve kitaplıklara yükseltmelerin, hiçbir şey göndermenize gerek kalmadan ürününüzü geliştirmek için yayıldığı anlamına gelir .
  • Eklentiler her zaman dinamik bağlantı gerektirir.
  • Statik bağlantı, kodun çok sınırlı ortamlarda (önyükleme işleminin başında veya kurtarma modunda) çalışacağını bildiğiniz anlamına gelir .
  • Statik bağlantı, ikili programların farklı kullanıcı ortamlarına dağıtılmasını kolaylaştırabilir (daha büyük ve daha fazla kaynağa aç program göndermek pahasına).
  • Statik bağlama hafifçe izin verebilir daha hızlı başlatma süreleri, ama bu boyutta ve programın karmaşıklığı hem bir dereceye kadar değişir ve OS'nin yükleme stratejisinin ayrıntıları.

Bazı düzenlemeler yorumlarda ve diğer yanıtlarda çok alakalı önerileri içerir. Bunu kırma şeklinizin hangi ortamda çalışmayı planladığınıza çok bağlı olduğunu belirtmek isterim. En az katıştırılmış sistemlerin dinamik bağlantıyı desteklemek için yeterli kaynağı olmayabilir. Biraz daha büyük küçük sistemler dinamik bağlantıyı iyi destekleyebilir, çünkü bellekleri dinamik bağlantıdan RAM tasarruflarını çok çekici hale getirecek kadar küçüktür. Mark'ın belirttiği gibi tam gelişmiş tüketici bilgisayarları muazzam kaynaklara sahiptir ve muhtemelen rahatlık sorunlarının bu konudaki düşüncelerinizi yönlendirmesine izin verebilirsiniz.


Performans ve verimlilik sorunlarını ele almak için: duruma göre değişir .

Klasik olarak, dinamik kütüphaneler bir tür yapıştırıcı katmanı gerektirir, bu da genellikle işlev göndermede çift dağıtım veya fazladan bir dolaylama katmanı anlamına gelir ve biraz hıza mal olabilir (ancak işlev çağırma süresi aslında çalışma sürenizin büyük bir kısmıdır ???).

Ancak, hepsi aynı kitaplığı çok çağıran birden çok işlem çalıştırıyorsanız, statik bağlantı kullanmaya göre dinamik bağlantı kullanırken önbellek satırlarını kaydedebilir (ve böylece çalışan performansı kazanabilirsiniz). (Modern işletim sistemleri statik olarak bağlantılı ikili dosyalarda aynı segmentleri fark edecek kadar akıllı olmadıkça. Zor görünüyor, kimse biliyor mu?)

Başka bir sorun: yükleme süresi. Bir noktada yükleme masraflarını ödersiniz. Bu maliyeti ödediğinizde, işletim sisteminin nasıl çalıştığına ve kullandığınız bağlantıya bağlıdır. Belki ihtiyacınız olduğunu bilinceye kadar ödemeyi ertelemeyi tercih edersiniz.

Statik-dinamik bağlamanın geleneksel olarak bir optimizasyon sorunu olmadığını unutmayın , çünkü her ikisi de nesne dosyalarına kadar ayrı bir derleme içerir. Bununla birlikte, bu gerekli değildir: bir derleyici prensipte, ilk olarak sindirilmiş bir AST formuna "statik kütüphaneleri" derleyebilir ve bu AST'leri ana kod için oluşturulanlara ekleyerek "böylece" global optimizasyonu güçlendirebilir. Kullandığım sistemlerin hiçbiri bunu yapmaz, bu yüzden ne kadar iyi çalıştığı hakkında yorum yapamam.

Performans sorularını yanıtlamanın yolu her zaman test etmektir (ve dağıtım ortamına mümkün olduğunca bir test ortamı kullanmaktır).


24
Kaynak tüketimi temelde zaman geçtikçe daha az endişe yaratan kod alanıdır. 500K kütüphane 2MB tasarruf sağlayan 5 işlem arasında paylaşılıyorsa, bu 3GB RAM'in% 0,1'inden daha azdır.
Mark Ransom

3
Kütüphane aynı sanal eşlemeyi de paylaşıyorsa (tüm işlemlerde aynı fiziksel ve sanal adres), dinamik bir bağlantı işlemcinin MMU'suna TLB yuvalarını da kaydetmez mi?
Zan Lynx

6
Ayrıca dinamik bir bağlantı, buggy kitaplığı kodunu daha iyi sürümlerle güncellemeyi kolaylaştırır.
Zan Lynx

89
@Zan Ayrıca, çalışan bir sürüme buggy kodu eklemeyi kolaylaştırır.

6
"Eklentiler her zaman dinamik bağlantı gerektirir." Bu yanlış. Apple'ın AudioUnits gibi bazı eklenti modelleri eklentiyi ayrı bir işlemde çalıştırabilir ve IPC kullanabilir. Bu, eklentiler için dinamik bağlantıya daha güvenli bir alternatiftir (eklenti ana bilgisayarı çökertemez). Cevabın "Eklentiler dinamik bağlantı gerektirebilir" veya benzeri bir sürümle güncellenmesini önerin.
Taylor

68

1) bir DLL işlevini çağırmanın her zaman ekstra bir dolaylı atlama kullanmasına dayanır. Bugün, bu genellikle önemsizdir. DLL içinde i386 CPU'larda biraz daha fazla yük var, çünkü konumdan bağımsız kod üretemiyorlar. AMD64'te, atlamalar program sayacına göre olabilir, bu nedenle bu büyük bir gelişmedir.

2) Bu doğru. Profillemenin yönlendirdiği optimizasyonlarla genellikle yüzde 10-15 oranında performans kazanabilirsiniz. Şimdi CPU hızı sınırlarına ulaştığına göre buna değebilir.

Şunu ekleyeceğim: (3) bağlayıcı daha önbellek etkin bir gruplama fonksiyonlarını düzenleyebilir, böylece pahalı önbellek seviyesi özlüyor minimize edilir. Ayrıca özellikle uygulamaların başlangıç ​​zamanını etkileyebilir (Sun C ++ derleyicisiyle gördüğüm sonuçlara dayanarak)

Ve DLL'lerde ölü kod ortadan kaldırmanın yapılamayacağını unutmayın. Dile bağlı olarak, DLL kodu da uygun olmayabilir. Derleyici bir istemcinin üzerine yazıp yazmadığını bilmediği için sanal işlevler her zaman sanaldır.

Bu nedenlerle, DLL'lere gerçek bir ihtiyaç yoksa, sadece statik derleme kullanın.

EDIT (yorumu kullanıcı alt çizgisine göre cevaplamak için)

Pozisyon bağımsız kod sorunu hakkında iyi bir kaynak http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/

Açıklandığı gibi x86 onları başka bir şey için AFAIK yok sonra 15 bit atlama aralıkları ve koşulsuz atlama ve aramalar için değil. Bu yüzden 32K'dan daha fazla olan fonksiyonlar (jeneratörlerden) her zaman bir sorun olmuştur ve gömülü trambolinlere ihtiyaç duymuştur.

Ancak Linux gibi popüler x86 işletim sistemlerinde .so / DLL dosyasının gccanahtarla oluşturulmadığına -fpic(dolaylı atlama tablolarının kullanılmasını zorunlu kılan) dikkat etmeniz gerekmez . Çünkü bunu yapmazsanız, kod normal bir bağlayıcının yerini değiştireceği gibi sabitlenir. Ancak bunu yaparken, kod segmentini paylaşılamaz hale getirir ve kodun diskten belleğe tam olarak eşlenmesi ve kullanılmadan önce hepsine dokunması gerekir (önbelleklerin çoğunu boşaltmak, TLB'leri vurmak) vb. bu yavaş kabul edildiğinde.

Yani artık bir faydası olmazdı.

Ben OS (Solaris veya FreeBSD) Ben sadece yapmıyorum çünkü benim Unix yapı sistemi ile bana sorun verdi ve ben de başvurdum kadar yüzden kaza merak neyi hatırlamıyorum -fPICiçin gcc.


4
Bu yanıtı seviyorum, çünkü soruda dile getirdiğim noktalara değinen tek kişi oydu.
Eloff

Bu DLL tekniklerine referanslar ve farklı işletim sistemleri arasında bir karşılaştırma olması ilginç olurdu.
UncleZeiv

İyi görünüyor, ancak CPU hızı kesinlikle sınırlarına ulaşmadı.
Aidiakapi

67

Dinamik bağlantı, LGPL gibi bazı lisans gereksinimlerini karşılamanın tek pratik yoludur .


17
Son kullanıcı LGPL'd koduna yeniden bağlayabildiği sürece (örneğin, kaynak kodunuzu veya derlenmiş nesne dosyalarınızı yazılımınızla sağladığınız için), statik bağlantı iyidir . Ayrıca, yazılımınız dahili kullanım içinse (yani yalnızca kuruluşunuzda kullanılacak ve dağıtılamayacaksa), statik olarak bağlayabilirsiniz. Bu, örneğin, sunucunun dağıtılmadığı sunucu yazılımı için geçerlidir.
JBentley

3
Anlama. Yazdıklarınızı takdir etmek için bana daha fazla kaynak verebilir misiniz (veya daha fazla ayrıntı verebilir misiniz)?
Baskaya

4
@Thorn LGPL lisans bölümü 4.d + e'ye bakın . Kullanıcının bağlantı yapmasını gerektiren bir biçimde dağıtmanız veya paylaşılan (dinamik) bir kitaplığı dağıtmanız gerekir.
Mark Ransom

46

Ben dnmckee bahsettiğim noktalara katılıyorum, artı:

  • Eksik olarak veya yanlış yere yüklendiklerinde sorunlara neden olabilecek daha az dosya bağımlılığı (.dll / .so) olduğundan veya hiç olmadığından, statik olarak bağlı uygulamaların dağıtımı daha kolay olabilir.

6
Google'dan Go derleyicisinin temel olarak bu nedenle ikili dosyaları yalnızca statik olarak derleyeceğini belirtmek gerekir .
Hut8

34

Statik olarak bağlı bir yapı yapmanın bir nedeni, yürütülebilir dosya için tam kapanışa sahip olduğunuzu, yani tüm sembol referanslarının doğru bir şekilde çözüldüğünü doğrulamaktır.

Sürekli entegrasyon kullanılarak inşa edilen ve test edilen büyük bir sistemin bir parçası olarak, gece regresyon testleri, yürütülebilir dosyaların statik olarak bağlı bir versiyonu kullanılarak gerçekleştirilmiştir. Bazen, dinamik olarak bağlı yürütülebilir dosya başarılı bir şekilde bağlansa bile, bir sembolün çözülmeyeceğini ve statik bağlantının başarısız olacağını görürüz.

Bu genellikle, paylaşılan kütlelerin içinde derinlemesine oturan sembollerin yanlış yazılmış bir isme sahip olması ve dolayısıyla statik olarak bağlanmadığı durumlarda ortaya çıkıyordu. Dinamik bağlayıcı, önce derinlik veya genişlik ilk değerlendirmesini kullanmadan bağımsız olarak tüm sembolleri tamamen çözmez, böylece tam olarak kapanmayan dinamik olarak bağlantılı bir yürütülebilir dosyayla sonlandırabilirsiniz.


1
çok iyi bir nokta, ben son zamanlarda iş yerinde bazı kod ile yapmaya çalışıyorum ama her şeyi derleme statik şaşırtıcı derecede can sıkıcı kanıtladı ve ben sadece vazgeçti
UncleZeiv

21

1 / Dinamik bağlantının statik bağlamaya karşı karşılaştırıldığı ve farkın dinamik bağlamaya geçecek kadar küçük olmadığı projelerde bulundum (testin bir parçası değildim, sadece sonucu biliyorum)

2 / Dinamik bağlantı genellikle PIC (Konumdan Bağımsız Kod, yüklendiği adrese bağlı olarak değiştirilmesi gerekmeyen kod) ile ilişkilidir. Mimariye bağlı olarak PIC başka bir yavaşlama getirebilir, ancak iki yürütülebilir dosya (ve işletim sistemi bir güvenlik önlemi olarak yükleme adresinin rastgele seçilmesi durumunda aynı yürütülebilir dosyanın iki işlemi) arasında dinamik olarak bağlantılı bir kitaplığın paylaşılmasından faydalanmak için gereklidir. Tüm işletim sistemlerinin iki kavramı ayırmasına izin verdiğinden emin değilim, ancak Solaris ve Linux, HP-UX'in de yaptığı ISTR ve bunu yapıyor.

3 / "Kolay düzeltme eki" özelliği için dinamik bağlantı kullanan diğer projelerde bulundum. Ama bu "kolay yama" küçük düzeltmenin dağıtımını biraz daha kolay ve karmaşık olanı sürümleme kabusu yapar Biz genellikle her şeyi itmek zorunda kaldı ve yanlış sürüm belirteci olduğu için müşteri sitesinde sorunları izlemek zorunda kaldı.

Sonuç olarak, istisna dışında statik bağlantı kullanmıştım:

  • dinamik bağlantıya bağlı eklentiler gibi şeyler için

  • paylaşım önemli olduğunda (C / C ++ çalışma zamanı, GUI kütüphaneleri gibi aynı anda birden çok işlem tarafından kullanılan büyük kütüphaneler, genellikle bağımsız olarak yönetilir ve ABI kesin olarak tanımlanır)

Eğer biri "kolay düzeltme ekini" kullanmak istiyorsa, kütüphanelerin yukarıdaki büyük kütüphaneler gibi yönetilmesi gerektiğini savunuyorum: düzeltmelerle değiştirilmemesi gereken tanımlanmış bir ABI ile neredeyse bağımsız olmaları gerekir.


1
PIC olmayan veya pahalı PIC işlemciler için bazı işletim sistemleri, bellekte belirli bir adrese yüklenecek dinamik kütüphaneler hazırlar ve bunu yapabilirlerse, kütüphanenin bir kopyasında, ona bağlanan her işleme eşler. Bu, PIC'nin yükünü çok azaltır. En azından OS X ve bazı Linux dağıtımları bunu yapıyor, Windows hakkında emin değilim.
Andrew McGregor

Teşekkürler Andrew, bazı Linux dağıtımlarının bunu kullandığını bilmiyordum. Takip edebileceğim bir referansınız veya daha fazla bilgi edinmek için arayabileceğim bir anahtar kelimeniz var mı? (FWIW Windows'un bunun bir varyantı yaptığını duymuştum, ancak Windows bundan bahsetmek için yetkinlik alanımın çok dışında.)
AProgrammer

Bence aradığınız anahtar kelime "prelink" - programın daha hızlı başlatılması için belirli bir adrese hızla yüklenecek bir kütüphane hazırlar.
Blaisorblade

20

Bu , linux ve performans sonuçları üzerindeki paylaşılan kütüphaneler hakkında ayrıntılı olarak tartışılmaktadır.


3
Drepper'in Linux'ta kitaplık yapan herkesin okuması gereken DSO howto'suna bağlantı için +1.
janneb

10

Unix benzeri sistemlerde dinamik bağlantı, 'root' uygulamasının yol dışı konumlarda yüklü paylaşılan kütüphanelerle bir uygulamayı kullanmasını zorlaştırabilir. Bunun nedeni dinamik bağlayıcının kök ayrıcalıklarına sahip işlemler için genellikle LD_LIBRARY_PATH veya eşdeğerine dikkat etmemesidir. Bazen, statik bağlantı günü kurtarır.

Alternatif olarak, yükleme işlemi kitaplıkları bulmak zorundadır, ancak bu, yazılımın birden çok sürümünün makinede birlikte var olmasını zorlaştırabilir.


1
Buradaki nokta LD_LIBRARY_PATH, en azından GNU / Linux'ta değil, paylaşılan kütüphaneleri kullanmak için bir engel değil. Örneğin, paylaşılan kitaplıkları ../lib/program dosyasına göre dizine koyarsanız, GNU araç zinciri ile linker seçeneği -rpath $ORIGIN/../libkitaplığın ilgili göreceli konumdan aranmasını belirtir. Daha sonra uygulamayı, ilişkili tüm paylaşılan kitaplıklarla birlikte kolayca yeniden konumlandırabilirsiniz. Bu hileyi kullanarak, uygulamanın ve kütüphanelerin birden fazla sürümüne sahip olmanın da bir problemi yok (eğer ilişkili olduklarını varsayarak, sembolik bağlantılar kullanabilirsiniz).
FooF

> kök ayrıcalıklarına sahip işlemler için. Kök olmayan kullanıcılardan çalıştırılan setuid programları hakkında konuştuğunuzu düşünüyorum - aksi takdirde bu hiç mantıklı değil. Standart olmayan konumlarda kütüphanelere sahip bir setuid ikili /etc/ld.so.confdosyası tuhaftır - ancak bu programlar yalnızca root yükleyebildiğinden, bu durum için de düzenleme yapabilir .
Blaisorblade

10

Gerçekten çok basit. Kaynak kodunuzda değişiklik yaptığınızda, kodun oluşturulması için 10 dakika mı yoksa 20 saniye mi beklemek istiyorsunuz? Yirmi saniye katlanabildiğim tek şey. Bunun ötesinde, ya kılıcı çıkarıyorum ya da ayrı bir derlemeyi nasıl kullanabileceğimi ve onu rahatlık bölgesine geri getirmek için nasıl bağlantı kurabileceğimi düşünmeye başlıyorum.


1
Aslında derleme hızlarındaki farkı karşılaştırmadım, ancak önemli ölçüde daha hızlı olsaydı dinamik bağlantı olurdu. Boost, derleme sürelerime olduğu gibi yeterince kötü şeyler yapıyor.
Eloff

9

Dinamik bağlantı için en iyi örnek, kitaplığın kullanılan donanıma bağlı olmasıdır. Eski zamanlarda C matematik kütüphanesinin dinamik olduğuna karar verildi, böylece her platform onu ​​optimize etmek için tüm işlemci yeteneklerini kullanabilir.

Daha iyi bir örnek OpenGL olabilir. OpenGl, AMD ve NVidia tarafından farklı şekilde uygulanan bir API'dir. Ayrıca, donanım farklı olduğu için bir AMD kartında NVidia uygulaması kullanamazsınız. Bu nedenle OpenGL'yi programınıza statik olarak bağlayamazsınız. Dinamik bağlantı burada API'nın tüm platformlar için optimize edilmesini sağlamak için kullanılır.


8

Dinamik bağlantı, işletim sisteminin dinamik kitaplığı bulması ve yüklemesi için fazladan zaman gerektirir. Statik bağlantı ile her şey bir arada ve belleğe tek seferlik bir yük.

Ayrıca, bkz. DLL Hell . Bu, işletim sisteminin yüklediği DLL'nin uygulamanızla birlikte gelen DLL veya uygulamanızın beklediği sürüm olmadığı senaryodur.


1
DLL Hell önlemek için bir dizi önlem olduğunu unutmayın.
ocodo

5

Henüz tartışılmayan bir diğer konu kütüphanedeki hataları düzeltmektir.

Statik bağlantı ile, yalnızca kitaplığı yeniden oluşturmakla kalmaz, aynı zamanda yürütülebilir dosyayı yeniden bağlamanız ve yeniden dağıtmanız gerekir. Kitaplık yalnızca bir yürütülebilir dosyada kullanılıyorsa, bu bir sorun olmayabilir. Ancak yeniden bağlanması ve yeniden dağıtılması gereken daha fazla yürütülebilir dosya, ağrı daha büyüktür.

Dinamik bağlantı ile, dinamik kütüphaneyi yeniden oluşturup yeniden dağıtabilirsiniz ve işiniz tamamlanmış demektir.


2

statik bağlantı size sadece tek bir exe verir, bir değişiklik yapmak için tüm programınızı yeniden derlemeniz gerekir. Dinamik bağlantıda sadece dll üzerinde değişiklik yapmanız gerekir ve exe çalıştırdığınızda, değişiklikler çalışma zamanında alınır. Dinamik bağlantı (örneğin: windows) güncellemeleri ve hata düzeltmeleri sağlamak daha kolaydır.


2

Aşırı düzeyde statik bağlamanın uygulamalar ve sistem performansı üzerinde çok büyük olumlu etkileri olabileceği çok sayıda ve giderek artan sayıda sistem vardır.

Çoğunlukla artık genel amaçlı işletim sistemlerini kullanan ve çoğu zaman akla gelebilecek her şey için kullanılan "gömülü sistemler" olarak adlandırılanlara atıfta bulunuyorum.

Son derece yaygın bir örnek, Busybox kullanan GNU / Linux sistemlerini kullanan cihazlardır . Ben hem çekirdek hem de kök dosya sistemi içeren bir önyüklenebilir i386 (32-bit) sistem görüntüsü oluşturarak NetBSD ile aşırıya götürdüm , ikincisi sabit bağlantılı tek bir statik bağlantılı (by crunchgen) ikili içeren kendisi içerdiği tüm programlar tüm (toolchain hariç çoğu) standart tam özellik sistem programlarının (iyi son sayıma göre 274 at) ve 20'den az olan mega boyutunda bayt (ve muhtemelen sadece 64MB bir sistemde çok rahat çalışır (kök dosya sistemi sıkıştırılmamış ve tamamen RAM'de olsa bile), test etmek için çok küçük bir tane bulamadım).

Daha önceki yazılarda, statik bağlantılı bir ikili dosyaların başlatma süresinin daha hızlı olduğu (ve çok daha hızlı olabileceği ) belirtildi, ancak bu, özellikle de tüm nesne kodları birbirine bağlandığında resmin sadece bir kısmı ve daha da fazlası özellikle işletim sistemi doğrudan yürütülebilir dosyadan kod talep çağrılarını destekliyorsa. Bu ideal senaryoda, programların başlangıç ​​zamanı tam anlamıyla ihmal edilebilir, çünkü inittalep edilen program olmasa bile , kodun neredeyse tüm sayfaları zaten bellekte olacak ve kabuk (ve çalışıyor olabilecek diğer arka plan işlemleri) tarafından kullanılacaktır. programın çalışma zamanı gereksinimlerini karşılamak için belki de yalnızca bir sayfa belleğin yüklenmesi gerektiğinden önyüklemeden beri çalıştırılır.

Ancak bu hala hikayenin tamamı değil. Ayrıca, tüm ikili dosyaları statik olarak bağlayarak NetBSD işletim sistemi yüklemelerini tam geliştirme sistemlerim için genellikle oluşturur ve kullanırım. Her ne kadar bu çok daha fazla disk alanı gerektirse de (toolchain ve X11 statik bağlantılı dahil olmak üzere her şeyle birlikte x86_64 için ~ 6.6GB toplam) (özellikle biri tüm hata ayıklama sembol tablolarını başka bir program için kullanılabilir tutarsa ​​~ 2.5GB), sonuç yine de genel olarak daha hızlı çalışır ve bazı görevler için kütüphane kod sayfalarını paylaşmayı amaçlayan tipik bir dinamik bağlantılı sistemden daha az bellek kullanır. Disk ucuz (hatta hızlı disk) ve sık kullanılan disk dosyalarını önbelleğe almak için bellek de nispeten ucuz, ancak CPU döngüleri gerçekten değil ve ld.soher başlayan her işlem için başlangıç ​​maliyetini ödüyorBaşladığı zaman, özellikle bir geliştirme sistemindeki derleyiciler gibi, aynı programlar tekrar tekrar kullanıldığında, birçok işlemin başlatılmasını gerektiren görevlerden saatler ve saatler süren CPU döngüleri alacaktır. Statik bağlantılı araç zinciri programları, sistemlerim için tüm işletim sistemi çoklu mimarisi oluşturma sürelerini saatlerce azaltabilir . Araç zincirini henüz tekli crunchgenikili dosyama inşa etmedim, ancak yaptığım zaman CPU önbelleğinin kazanılması nedeniyle daha fazla inşa süresi kazanacağından şüpheleniyorum.


2

Statik bağlantı, programın ihtiyaç duyduğu dosyaları tek bir yürütülebilir dosyada içerir.

Dinamik bağlantı her zamanki gibi düşünürsünüz, yine de DLL gerektiren bir yürütülebilir dosya yapar ve böyle aynı dizinde (veya DLL'ler sistem klasöründe olabilir).

(DLL = dinamik bağlantı kitaplığı)

Dinamik olarak bağlı yürütülebilir dosyalar daha hızlı derlenir ve kaynak ağırlıklı değildir.


0

Static linking , bağlantılı bir içeriğin birincil ikili dosyaya kopyalandığı ve tek bir ikili dosya olduğu zaman derleme işlemidir.

Eksileri:

  • derleme süresi daha uzundur
  • çıkış ikili dosyası daha büyük

Dynamic linkingbağlantılı bir içerik yüklendiğinde çalışma zamanında gerçekleştirilen bir işlemdir. Bu teknik şunları sağlar:

  • ABIkararlılığı artıran birincil bir yeniden derlemeden bağlı ikili yükseltme [Hakkında]
  • tek bir paylaşılan kopyaya sahip olmak

Eksileri:

  • başlangıç ​​zamanı daha yavaş (bağlantılı içerik kopyalanmalıdır)
  • bağlayıcı hataları çalışma zamanında atılır
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.