[Haskell-cafe] Partial statical linking

Jason Dusek jason.dusek at gmail.com
Wed Sep 19 13:06:21 CEST 2012


2011/12/1 Irene Knapp <ireney.knapp at gmail.com>:
> The typical trick to force GHC to statically link a C library
> is to give the full path to the .a of it as one of the object
> files in the GHC invocation that does the final linking.  This
> means you don't need any -l or -L flags pertaining to that
> library.  Some libraries are very particular about the order
> you list them in when doing this, but I don't really
> understand the issues there.  You usually will also have to
> chase dependencies by hand and list them in the same fashion.

I recently tried using this method to create static binary; but
I was not able to get it to work. I thought I would revive this
old thread and see if anyone else has given it a shot.

What I attempted was building a binary with only some C libraries
statically linked, with this command line:

  # Build https://github.com/erudify/sssp on Ubunut 12.04
  ghc -outputdir ./tmp -v --make -O2 sssp.hs -o sssp.ubuntu \
    /usr/lib/x86_64-linux-gnu/libffi.a \
    /usr/lib/x86_64-linux-gnu/libgmp.a \
    /usr/lib/x86_64-linux-gnu/libz.a

However, this really made no difference. Running `ldd' on the
resulting binary reveals that libz and friends are still
dynamically linked:

  ldd sssp.ubuntu
          linux-vdso.so.1 =>  (0x00007fff94253000)
          libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f0ddfdbb000)
          libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0
(0x00007f0ddfb9e000)
          libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10
(0x00007f0ddf92f000)
          libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6
(0x00007f0ddf727000)
          libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f0ddf42d000)
          librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f0ddf224000)
          libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f0ddf020000)
          libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0ddec63000)
          /lib64/ld-linux-x86-64.so.2 (0x00007f0ddffdb000)

There is always -optl-static which, nowadays, results in a
truly static executable; but it leads to a lot of warnings, too.

--
Jason Dusek
pgp // solidsnack // C1EBC57DC55144F35460C8DF1FD4C6C1FED18A2B



More information about the Haskell-Cafe mailing list