2016-04-02 21 views
1

Kütüphane derlendiğinde kütüphanede (Crypto ++) neredeyse 50MB var.Statik Kütüphane bağlantılı Program VS Kaynak Kodu Derlenmiş program büyük boyut farkı

Crypto ++ kaynak kodunu aldım ve yalnızca uygulamamda kullanacağım algoritmaların kaynak dosyalarını ekledim. Daha sonra uygulamayı yarattım ve Crypto ++ 'yi statik bir kütüphane olarak derlemeye ve aynı projenin klonlanmış bir sürümüyle ilişkilendirmeye karar verdim. derlemek ve sadece ben vb AES, SHA256, ihtiyaç algoritmaları kullanmak sadece gerekli kaynak dosyaları içeriyor:

Proje 1:

yüzden şimdi 2 projemiz var.

Proje 2: Yalnızca üstbilgi dosyaları ve Crypto ++ bağlantılı statik lib dosyası var.

Şimdi, her iki projeyi derlediğimde, her ikisinin de aynı boyuta sahip olduğunu görmem gerekiyordu (ya da her zaman düşündüm), linker sadece Project 2'de kullandığım kaynağı yalnızca exe'ye bağlayacağından, temelde Proje 1'de kullandığım aynı dosyaları tam olarak bağlardım. Ancak durum böyle değil, Proje 1 ve Project 2'ye göre çok büyük bir fark görüyorum ... Statik kütüphaneyi kullanan proje, 6.2 kat daha büyüktür. kaynak kodu ile derlendi proje (Her iki yayın modunda derlenmiş)

Projesi 1 (kaynak) boyutu:. 210KB Projesi 2 (statik lib) boyutu: 1,303kb

Bu neden? Ben her zaman linker sadece benim kod üzerinde başvuruda bulunduğum şeyi kullanmak gerekiyordu. Bu sadece bir linker verimsizlik mi?

Birisi beni aydınlatabilir mi?

cevap

0

Linker yalnızca başvurulan şeyi kullanır. Gözlemlediğiniz davranış, tüm kripto kitaplığının tek bir nesne olarak oluşturulmuş olmasının doğrudan bir sonucudur. Linker, her şeyi dahil etmek için bir seçeneği yok. Linker, kütüphane için kaynak kodunuz varsa ve projenizin yanına inşa ederseniz beklediğiniz şeyi yapabilir.

0

I (Kripto ++) toplam onun neredeyse 50MB kütüphane derlenmiş ....

Evet, statik kütüphane etrafında bütün sembolleri taşıyan bir kütüphane var. Gerekli olmadığı için hiçbir şey atılamaz.

-g kullandıysanız, hata ayıklama bilgilerini de taşır. Bazı optimizasyon bayrakları da bunu etkileyecektir. Örneğin -Os kod boyutunu en aza indirir.


statik kitaplığını kullanır proje

kaynak kodu ile derlendi proje daha 6,2 kat daha büyüktür. Bu neden?

Neler olup bittiğini daha iyi açıklamak için programınızı ve derleyicinizle linker anahtarlarınızı görmemiz gerekiyor.

Projesi 1 (kaynak) boyutu: 210KB Projesi 2 (statik lib) boyutu: 1,303kb

bu rakamlar dayanarak, beklediğiniz kadar bazı ölü kod sıyırma gerçekleşiyor tahmin söylemiyorum ama bağlayıcı gerekiyordu olsa

hep sadece benim kod üzerinde referans ettiğimi kullanın. Bu sadece bir linker verimsizlik mi?

Crypto ++ kütüphanesini oluştururken, make lean tarifini kullanın. İşlev bölümleri (-ffunction-sections) ve veri bölümleri (-fdata-sections) ekler, böylece linker kullanılmayan kod ve verileri atmada daha iyi bir iş çıkarır. Ayrıca Crypto ++ wiki'de GNUmakefile | Makefile Targets'a bakın.

Uygulamanızı bağladığınızda uygun linker anahtarını kullanın. GCC/LD ile, bu -Wl,--gc-sections olacaktır. Apple/DYLD altında, bu -Wl,-dead_strip olurdu. Ayrıca, ikili boyutu daha da azaltacak olan hata ayıklama simgelerini de şeritleyebilirsiniz. Eğer sembollerle inşa edilmiş ya da sonradan soyulmuşsa, bana açık değil.

Sembolleri tamamen kaldırır ve atarsanız, yığın izleri çoğunlukla işe yaramaz olacaktır. Sembolleri çevrimdışı bir dosyada saklarsanız, yığın izlemeyi anlamış olabilirsiniz. Ayrıca, Crypto ++ wiki'de Debug Symbols'a bakın. İşte


kullanıcıları için lean hedef araştıran elde edilen sonuçlardır. Ayrıca Crypto ++ kullanıcı grubunda 'make lean' target?'a bakın.

Testi programı:

int main(int, char**) { 

    Integer j("100000000000000000000000000000000"); 
    j %= 1999; 

    cout << "j: " << j << endl; 

    return 0; 
} 

Yalın (make lean ile inşa kütüphane, program -Wl,--gc-sections ile bağlantılı):

$ ls -l integer.exe 
-rwx------ 1 jwalton staff 162012 Jan 4 13:00 integer.exe 

Normal (make, herhangi bir özel bağlayıcı anahtarları ile inşa kütüphanesi):

$ ls -l integer.exe 
-rwx------ 1 jwalton staff 2636952 Jan 4 13:02 integer.exe 
lean hedef Kripto ++ 5.6.3 sonra ilave edildi

yayımlanmıştır. Eğer Commit 9696b9e5e79ff18a dan elle GNUmakefile için aşağıdaki yamayı uygulayabilirsiniz,

git clone https://github.com/weidai11/cryptopp.git cryptopp 

Veya: Sen eğer istersen Master kod getirmesi gerekir.tarifler nerede aşağıdaki

+# Dead code stripping. Issue 'make lean'. 
+ifeq ($(findstring lean,$(MAKECMDGOALS)),lean) 
+ifeq ($(findstring -ffunction-sections,$(CXXFLAGS)),) 
+CXXFLAGS += -ffunction-sections 
+endif # CXXFLAGS 
+ifeq ($(findstring -fdata-sections,$(CXXFLAGS)),) 
+CXXFLAGS += -fdata-sections 
+endif # CXXFLAGS 
+ifneq ($(IS_DARWIN),0) 
+ifeq ($(findstring -Wl,-dead_strip,$(LDFLAGS)),) 
+LDFLAGS += -Wl,-dead_strip 
+endif # CXXFLAGS 
+else # BSD, Linux and Unix 
+ifeq ($(findstring -Wl,--gc-sections,$(LDFLAGS)),) 
+LDFLAGS += -Wl,--gc-sections 
+endif # LDFLAGS 
+endif # MAKECMDGOALS 
+endif # Dead code stripping 

Ve: böylece hat 270 veya etrafında ekle

+.PHONY: lean 
+lean: libcryptopp.a cryptest.exe 
+ 
İlgili konular