2013-01-11 13 views
7

Sto usando Debian/MIPS + QEMU per creare MIPS ports of PortFusion (una soluzione di tunneling TCP). I binari risultanti sono collegati a GNU libc. Pertanto, non possono essere semplicemente copiati e utilizzati su vanilla OpenWrt che viene fornito con uclibc anziché eglibc (che sembra compatibile con binario GNU libc).GHC: collegamento statico dei binari di Linux per i processori ARM e MIPS


  • può GHC 7.4 non collegare staticamente libc (+ libgmp, ecc) con i binari di Linux per i processori ARM e MIPS?
  • Come è possibile verificare se GHC è stato creato con la compilazione completamente statica disponibile?

-static ignorato su MIPS:

[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) 

informazioni GHC:

[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\"]") 
] 

Vedi anche: Can GHC link binaries against a libc implementation such as uclibc (used in OpenWrt by default)?

+1

La guida '-static -optl-pthread -optl-static'? – gspr

+1

Se ricordo correttamente, '-optl-static' si assicura che il linker per le librerie C sia detto di collegarsi staticamente. AFAIK deve anche essere detto di includere pthreads, a causa di alcuni ordini delle librerie che sono stati incasinati. Penso che questi flag siano richiesti per un binario completamente statico anche su x86. – gspr

+1

@gspr funziona! Dovresti metterlo come risposta. –

risposta

8

In fact, il flag -static indica semplicemente a GHC di evitare il collegamento dinamico alle librerie Haskell. Per collegare staticamente anche alle librerie C, è necessario passare anche -optl-pthread -optl-static. Quest'ultimo dice al linker di collegarsi staticamente alle librerie C, mentre il primo è (AFAIK) necessario a causa di qualche ordine delle librerie collegate che vengono messe in disordine quando si fa questo.

Sono necessari gli stessi flag per un binario completamente statico su x86, quindi questo non è specifico per ARM e MIPS.

+1

Credo che avere 'ld-options: -static' su x86 in [' PortFusion.cabal'] (http://hackage.haskell.org/packages/archive/PortFusion/1.2.1/PortFusion.cabal) è stato sufficiente, Ho costruito e verificato l'staticità dei binari Linux x86-64 e x86-32 senza '-pthread'. Grazie per aver indicato entrambi! Su ARM e MIPS '-pthread' sembra essere strettamente necessario. –

+1

Ah, buono a sapersi. Grazie! – gspr