title: How to compile Haskell to a static library?
body: <p>Hey,
  I'm learning Haskell and I'm interested in using it to make static libraries for using in Python and probably C. After some googling I found out how to get GHC to output a shared object, but it dynamically depends on GHC`s libraries.
  The resulting ELF from compiling in GHC is dynamically dependand only on C libs and it's a bit under a MB in size - it has been statically linked with GHC`s libs. How and if can this be achieved for shared objects?</p>
  
  <p>Example of current state:</p>
  
  <pre><code>$ ghc --make -dynamic -shared -fPIC foo.hs -o libfoo.so
  $ ldd libfoo.so
      linux-vdso.so.1 =&gt;  (0x00007fff125ff000)
      libHSbase-4.2.0.2-ghc6.12.3.so =&gt; /usr/lib/ghc-6.12.3/base-4.2.0.2/libHSbase-4.2.0.2-ghc6.12.3.so (0x00007f7d5fcbe000)
      libHSinteger-gmp-0.2.0.1-ghc6.12.3.so =&gt; /usr/lib/ghc-6.12.3/integer-gmp-0.2.0.1/libHSinteger-gmp-0.2.0.1-ghc6.12.3.so (0x00007f7d5faac000)
      libgmp.so.10 =&gt; /usr/lib/libgmp.so.10 (0x00007f7d5f816000)
      libHSghc-prim-0.2.0.0-ghc6.12.3.so =&gt; /usr/lib/ghc-6.12.3/ghc-prim-0.2.0.0/libHSghc-prim-0.2.0.0-ghc6.12.3.so (0x00007f7d5f591000)
      libHSffi-ghc6.12.3.so =&gt; /usr/lib/ghc-6.12.3/libHSffi-ghc6.12.3.so (0x00007f7d5f383000)
      libc.so.6 =&gt; /lib/libc.so.6 (0x00007f7d5f022000)
      /lib/ld-linux-x86-64.so.2 (0x00007f7d60661000)
  
  $ ghc foo.hs
  $ ldd foo
      linux-vdso.so.1 =&gt;  (0x00007fff2d3ff000)
      libgmp.so.10 =&gt; /usr/lib/libgmp.so.10 (0x00007f50014ec000)
      libm.so.6 =&gt; /lib/libm.so.6 (0x00007f5001269000)
      librt.so.1 =&gt; /lib/librt.so.1 (0x00007f5001061000)
      libdl.so.2 =&gt; /lib/libdl.so.2 (0x00007f5000e5d000)
      libc.so.6 =&gt; /lib/libc.so.6 (0x00007f5000afc000)
      libpthread.so.0 =&gt; /lib/libpthread.so.0 (0x00007f50008df000)
      /lib/ld-linux-x86-64.so.2 (0x00007f5001759000)
  </code></pre>
  
  <p>If I try to compile it with(without '-dynamic'):</p>
  
  <pre><code>$ ghc --make -shared -fPIC foo.hs -o libfoo.so
  Linking libfoo.so ...
  /usr/bin/ld: foo.o: relocation R_X86_64_32S against `stg_CAF_BLACKHOLE_info' can not be used when making a shared object; recompile with -fPIC
  foo.o: could not read symbols: Bad value
  collect2: ld returned 1 exit status
  </code></pre>
  
  <p>When googling I found something about this whole issue - that it may come from the fact that GHC is compiled in a specific way(dynamic/static?) and so static linking is not possible. If this is true how is it possible that the ELF binary is statically linked?</p>
  
  <p>Anyway, I am hoping someone can shed some light on this since a huge amount of googling left me with more questions than I started with. </p>
  
  <p>Huge thanks.</p>