SORU
24 Mayıs 2011, Salı


Küçük Haskell programı büyük ikili içine DZD ile derlenmiş

Hatta basit küçük Haskell programları dev yürütülebilir dönüşüyor.

Boyutu 7 MB uzanan derlenmiş (DZD) ikili için küçük bir program yazdım!

Hatta küçük Haskell bir program büyük ikili derlenecek nedeni ne olabilir?

Eğer bir şey varsa, bunu azaltmak için ne yapabilirim?

CEVAP
24 Mayıs 2011, Salı


Bakalım neler olup bittiğini görmek, deneyin

  $ du -hs A
  13M   A

  $ file A
  A: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), 
     dynamically linked (uses shared libs), for GNU/Linux 2.6.27, not stripped

  $ ldd A
    linux-vdso.so.1 =>  (0x00007fff1b9ff000)
    libXrandr.so.2 => /usr/lib/libXrandr.so.2 (0x00007fb21f418000)
    libX11.so.6 => /usr/lib/libX11.so.6 (0x00007fb21f0d9000)
    libGLU.so.1 => /usr/lib/libGLU.so.1 (0x00007fb21ee6d000)
    libGL.so.1 => /usr/lib/libGL.so.1 (0x00007fb21ebf4000)
    libgmp.so.10 => /usr/lib/libgmp.so.10 (0x00007fb21e988000)
    libm.so.6 => /lib/libm.so.6 (0x00007fb21e706000)
    ...      

Bu DZD dinamik olarak bağlı bir yürütülebilir üretti ldd çıkış görürsün amasadece C kütüphaneleri dinamik olarak bağlantılıdır! Tüm Haskell kitaplıkları birebir kopyalanır.

Bir kenara: bu grafik ağırlıklı bir uygulama olduğu için, kesinlikle ghc -O2 ile derlemek istiyorum

Yapabileceğin iki şey var.

Semboller sıyırma

Kolay bir çözüm: ikili şerit:

$ strip A
$ du -hs A
5.8M    A

Şerit nesne dosyasından sembolleri siler. Genellikle sadece hata ayıklama için gereklidir.

Dinamik olarak Haskell kütüphaneler bağlı

Daha yakın zamanda, DZD dynamic linking of both C and Haskell libraries için destek kazanmıştır. En dağıtımlar şimdi DZD bir sürümünü dinamik desteklemek için inşa Haskell kütüphaneler bağlama dağıtmak. Haskell paylaşılan kitaplıkları yürütülebilir içine her zaman kopyalamadan çok Haskell programları arasında paylaşılan olabilir.

Linux ve Windows yazı zaman desteklenir.

Haskell kütüphaneler dinamik olarak bağlı izin vermek için, -dynamic ile onlar gibi çok derlemeniz gerekir:

 $ ghc -O2 --make -dynamic A.hs

Ayrıca, ortak olmak istediğiniz kitaplıkları --enabled-shared ile inşa edilmelidir:

 $ cabal install opengl --enable-shared --reinstall     
 $ cabal install glfw   --enable-shared --reinstall

Ve C ve Haskell bağımlılıklar hem de dinamik olarak çözülmüş olduğundan çok daha küçük bir yürütülebilir, birlikte bitireceğiz.

$ ghc -O2 -dynamic A.hs                         
[1 of 4] Compiling S3DM.V3          ( S3DM/V3.hs, S3DM/V3.o )
[2 of 4] Compiling S3DM.M3          ( S3DM/M3.hs, S3DM/M3.o )
[3 of 4] Compiling S3DM.X4          ( S3DM/X4.hs, S3DM/X4.o )
[4 of 4] Compiling Main             ( A.hs, A.o )
Linking A...

Ve oldu İşte!

$ du -hs A
124K    A

bile daha küçük hale getirmek için şerit yapabilirsiniz:

$ strip A
$ du -hs A
84K A

Sevimli mini minnacık bir yürütülebilir, birçok kadar dahili dinamik olarak bağlı C ve Haskell adet:

$ ldd A
    libHSOpenGL-2.4.0.1-ghc7.0.3.so => ...
    libHSTensor-1.0.0.1-ghc7.0.3.so => ...
    libHSStateVar-1.0.0.0-ghc7.0.3.so =>...
    libHSObjectName-1.0.0.0-ghc7.0.3.so => ...
    libHSGLURaw-1.1.0.0-ghc7.0.3.so => ...
    libHSOpenGLRaw-1.1.0.1-ghc7.0.3.so => ...
    libHSbase-4.3.1.0-ghc7.0.3.so => ...
    libHSinteger-gmp-0.2.0.3-ghc7.0.3.so => ...
    libHSghc-prim-0.2.0.0-ghc7.0.3.so => ...
    libHSrts-ghc7.0.3.so => ...
    libm.so.6 => /lib/libm.so.6 (0x00007ffa4ffd6000)
    librt.so.1 => /lib/librt.so.1 (0x00007ffa4fdce000)
    libdl.so.2 => /lib/libdl.so.2 (0x00007ffa4fbca000)
    libHSffi-ghc7.0.3.so => ...

Son bir nokta: hatta sadece statik bağlama sistemlerinde, 21**, tek elde edebilirsiniz .daha fazla statik olarak bağlı kütüphaneler boyutunu azaltabilir üst düzey işlevi, başına o dosya. DZD bazı sistemler, unutma ki-split-objs, inşa edilmesi gerekiyor.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ICON

    ICON

    19 EKİM 2011
  • Jabari Johnson

    Jabari Johns

    18 Ocak 2008
  • RomanAtwood

    RomanAtwood

    18 Kasım 2009