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)?
La guida '-static -optl-pthread -optl-static'? – gspr
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
@gspr funziona! Dovresti metterlo come risposta. –