आइए देखें कि क्या चल रहा है, कोशिश करें
$ 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)
...
आप ldd
आउटपुट से देखते हैं कि जीएचसी ने गतिशील रूप से जुड़े निष्पादन योग्य उत्पादन किया है, लेकिन केवल सी लाइब्रेरी गतिशील रूप से जुड़े हुए हैं ! सभी हास्केल पुस्तकालयों को वाचालता में कॉपी किया जाता है।
एक तरफ: चूंकि यह एक ग्राफिक्स-गहन ऐप है, मैं निश्चित रूप से इसका संकलन करूंगा ghc -O2
दो चीजें हैं जो आप कर सकते हैं।
अलग करना प्रतीकों
एक आसान समाधान: बाइनरी पट्टी:
$ strip A
$ du -hs A
5.8M A
स्ट्रीप ऑब्जेक्ट फ़ाइल से प्रतीकों को हटाता है। वे आम तौर पर केवल डिबगिंग के लिए आवश्यक हैं।
गतिशील रूप से हास्केल पुस्तकालयों से जुड़ा हुआ है
हाल ही में, जीएचसी ने सी और हास्केल पुस्तकालयों के गतिशील लिंकिंग के लिए समर्थन प्राप्त किया है । अधिकांश डिस्ट्रोस अब HHCell पुस्तकालयों के गतिशील लिंकिंग का समर्थन करने के लिए निर्मित GHC के एक संस्करण को वितरित करते हैं। साझा हास्केल पुस्तकालयों को हर बार निष्पादन योग्य में कॉपी किए बिना, कई हास्केल कार्यक्रमों के बीच साझा किया जा सकता है।
लेखन के समय लिनक्स और विंडोज समर्थित हैं।
हास्केल पुस्तकालयों को गतिशील रूप से जोड़ने की अनुमति देने के लिए, आपको उन्हें इस -dynamic
तरह से संकलित करने की आवश्यकता है :
$ ghc -O2 --make -dynamic A.hs
इसके अलावा, आपके द्वारा साझा की जाने वाली कोई भी लाइब्रेरी को इसके साथ बनाया जाना चाहिए --enabled-shared
:
$ cabal install opengl --enable-shared --reinstall
$ cabal install glfw --enable-shared --reinstall
और आप एक बहुत छोटे निष्पादन योग्य के साथ समाप्त हो जाएंगे, जिसमें सी और हास्केल निर्भरता दोनों गतिशील रूप से हल हो जाएंगे।
$ 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...
और, आवाज!
$ du -hs A
124K A
जिसे आप छोटा करने के लिए पट्टी कर सकते हैं:
$ strip A
$ du -hs A
84K A
एक्नेसी वेन्से निष्पादन योग्य, कई गतिशील रूप से जुड़े सी और हास्केल टुकड़ों से निर्मित:
$ 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 => ...
एक अंतिम बिंदु: केवल स्थैतिक लिंकिंग वाले सिस्टम पर भी, आप -split-objs का उपयोग कर सकते हैं , एक .o फ़ाइल प्रति शीर्ष स्तर के फ़ंक्शन को प्राप्त करने के लिए, जो सांख्यिकीय रूप से लिंक किए गए पुस्तकालयों के आकार को और कम कर सकता है। इसके लिए GHC की जरूरत है, जिसके साथ -plplit-objs बनाया जाना चाहिए, जिसे कुछ सिस्टम करना भूल जाते हैं।