2013-01-11 49 views
7

मैं MIPS ports of PortFusion (एक टीसीपी सुरंग समाधान) बनाने के लिए डेबियन/एमआईपीएस + क्यूईएमयू का उपयोग कर रहा हूं। परिणामस्वरूप द्विआधारी जीएनयू libc के खिलाफ जुड़े हुए हैं। इस प्रकार, उन्हें सिर्फ कॉपी नहीं किया जा सकता है और वेनिला ओपनवार्ट पर उपयोग किया जा सकता है, जो uclibceglibc (जो जीएनयू libc के साथ बाइनरी-संगत लगता है) के बजाय जहाजों पर प्रतिलिपि बनाई जा सकती है।जीएचसी: एआरएम और एमआईपीएस प्रोसेसर के लिए लिनक्स बाइनरी को स्थिर रूप से लिंक करना


  • GHC 7.4 स्थिर एआरएम और MIPS प्रोसेसर के लिए लिनक्स binaries के साथ libc (+ libgmp, आदि) लिंक नहीं कर सकते हैं?
  • मैं कैसे देख सकता हूं कि जीएचसी पूरी तरह स्थिर स्थिर संकलन के साथ बनाया गया है या नहीं? GHC पर

    [email protected]:~# cat hello.hs 
    main = print 2 
    [email protected]:~# ghc --make hello.hs 
    [1 of 1] Compiling Main    (hello.hs, hello.o) 
    Linking hello ... 
    [email protected]:~# ldd ./hello 
        libgmp.so.10 => /usr/lib/mips-linux-gnu/libgmp.so.10 (0x77908000) 
        libffi.so.5 => /usr/lib/mips-linux-gnu/libffi.so.5 (0x778ea000) 
        libm.so.6 => /lib/mips-linux-gnu/libm.so.6 (0x77855000) 
        librt.so.1 => /lib/mips-linux-gnu/librt.so.1 (0x7783c000) 
        libdl.so.2 => /lib/mips-linux-gnu/libdl.so.2 (0x77827000) 
        libc.so.6 => /lib/mips-linux-gnu/libc.so.6 (0x776a0000) 
        libpthread.so.0 => /lib/mips-linux-gnu/libpthread.so.0 (0x77675000) 
        /lib/ld.so.1 (0x55550000) 
    [email protected]:~# rm hello 
    [email protected]:~# ghc --make -static hello.hs 
    Linking hello ... 
    [email protected]:~# ldd ./hello 
        libgmp.so.10 => /usr/lib/mips-linux-gnu/libgmp.so.10 (0x76f98000) 
        libffi.so.5 => /usr/lib/mips-linux-gnu/libffi.so.5 (0x76f7a000) 
        libm.so.6 => /lib/mips-linux-gnu/libm.so.6 (0x76ee5000) 
        librt.so.1 => /lib/mips-linux-gnu/librt.so.1 (0x76ecc000) 
        libdl.so.2 => /lib/mips-linux-gnu/libdl.so.2 (0x76eb7000) 
        libc.so.6 => /lib/mips-linux-gnu/libc.so.6 (0x76d30000) 
        libpthread.so.0 => /lib/mips-linux-gnu/libpthread.so.0 (0x76d05000) 
        /lib/ld.so.1 (0x55550000) 
    

    जानकारी:


-static MIPS पर ध्यान नहीं दिया

[email protected]:~# ghc --info 
[("Project name","The Glorious Glasgow Haskell Compilation System") 
,("GCC extra via C opts"," -fwrapv") 
,("C compiler command","/usr/bin/gcc") 
,("C compiler flags"," -fno-stack-protector -Wl,--hash-size=31 -Wl,--reduce-memory-overheads") 
,("ar command","/usr/bin/ar") 
,("ar flags","q") 
,("ar supports at file","YES") 
,("touch command","touch") 
,("dllwrap command","/bin/false") 
,("windres command","/bin/false") 
,("perl command","/usr/bin/perl") 
,("target os","OSLinux") 
,("target arch","ArchUnknown") 
,("target word size","4") 
,("target has GNU nonexec stack","True") 
,("target has subsections via symbols","False") 
,("Project version","7.4.1") 
,("Booter version","7.4.1") 
,("Stage","2") 
,("Build platform","mips-unknown-linux") 
,("Host platform","mips-unknown-linux") 
,("Target platform","mips-unknown-linux") 
,("Have interpreter","NO") 
,("Object splitting supported","NO") 
,("Have native code generator","NO") 
,("Support SMP","NO") 
,("Unregisterised","YES") 
,("Tables next to code","YES") 
,("RTS ways","l debug ") 
,("Leading underscore","NO") 
,("Debug on","False") 
,("LibDir","/usr/lib/ghc") 
,("Global Package DB","/usr/lib/ghc/package.conf.d") 
,("Gcc Linker flags","[\"-Wl,--hash-size=31\",\"-Wl,--reduce-memory-overheads\"]") 
,("Ld Linker flags","[\"--hash-size=31\",\"--reduce-memory-overheads\"]") 
] 

भी देखें: Can GHC link binaries against a libc implementation such as uclibc (used in OpenWrt by default)?

+1

क्या '-static -optl-pthread -optl-static' मदद करता है? – gspr

+1

यदि मुझे सही ढंग से याद किया जाता है, तो '-प्टल-स्टेटिक' सुनिश्चित करता है कि सी पुस्तकालयों के लिंकर को स्थिर रूप से लिंक करने के लिए कहा जाता है। AFAIK को पुस्तकालयों के गड़बड़ होने के कुछ आदेशों के कारण पर्थ्रेड को शामिल करने के लिए भी कहा जाना चाहिए। मुझे लगता है कि x86 पर पूरी तरह स्थिर स्थिर बाइनरी के लिए ये झंडे आवश्यक हैं। – gspr

+1

@gspr यह काम करता है! आपको इसे एक उत्तर के रूप में रखना चाहिए। –

उत्तर

8

In fact, -static झंडा बस हास्केल पुस्तकालयों के गतिशील लिंकिंग से बचने के लिए जीएचसी को बताता है। सी पुस्तकालयों को भी स्थिर रूप से लिंक करने के लिए, आपको -optl-pthread -optl-static भी पास करने की आवश्यकता है। उत्तरार्द्ध लिंकर को सी पुस्तकालयों से स्थिर रूप से लिंक करने के लिए कहता है, जबकि पूर्व (AFAIK) को ऐसा करने के दौरान जुड़े हुए पुस्तकालयों के कुछ आदेशों के कारण आवश्यक है।

आपको x86 पर पूरी तरह स्थिर स्थिर बाइनरी के लिए एक ही झंडे की आवश्यकता है, इसलिए यह एआरएम और एमआईपीएस के लिए विशिष्ट नहीं है।

+1

मेरा मानना ​​है कि 'ld-options: -static' x86 पर ['PortFusion.cabal'] में है (http://hackage.haskell.org/packages/archive/PortFusion/1.2.1/PortFusion.cabal) पर्याप्त था, मैंने लिनक्स x86-64 और x86-32 बाइनरी की स्थिरता को '-pthread' के बिना बनाया और सत्यापित किया। दोनों को इंगित करने के लिए धन्यवाद! एआरएम और एमआईपीएस '-प्थ्रेड' पर कड़ाई से जरूरी प्रतीत होता है। –

+1

आह, जानना अच्छा है। धन्यवाद! – gspr