<div dir="ltr">BTW, this is the Makefile that builds the extension I mentioned: <a href="https://github.com/albertov/pg_schedule/blob/master/Makefile">https://github.com/albertov/pg_schedule/blob/master/Makefile</a>.<div>When LINK_STATICALLY=TRUE it produces an '.so' which only links dynamically to system libraries, all haskell libraries are linked statically:</div><div><br></div><div><span style="font-family:monospace"><span style="font-weight:bold;color:rgb(84,255,84)">alberto@albertows</span><span style="color:rgb(0,0,0)">:</span><span style="font-weight:bold;color:rgb(84,84,255)">~/src/thelonius</span><span style="color:rgb(0,0,0)">$ ldd /nix/store/1cy055y8ycs2acqa8w8qf6dbsnx7cc1b-pg_schedule-1.0/lib/schedule.so  </span><br>        linux-vdso.so.1 (0x00007fff191b9000)
<br>        libm.so.6 => /nix/store/fysbl29a8p8sa9z3wpnqpn56a0b54fap-glibc-2.26-75/lib/libm.so.6 (0x00007fae8aec6000)
<br>        libgmp.so.10 => /nix/store/jc8l6hlwl8hc590riqqkk0pr55sjfng2-gmp-6.1.2/lib/libgmp.so.10 (0x00007fae8ac33000)
<br>        libc.so.6 => /nix/store/fysbl29a8p8sa9z3wpnqpn56a0b54fap-glibc-2.26-75/lib/libc.so.6 (0x00007fae8a880000)
<br>        /nix/store/h1a1ncbkkhapzm0509plqjlfrgxw22f3-glibc-2.25-49/lib64/ld-linux-x86-64.so.2 (0x00007fae8cd4d000)<br>
<br></span></div><div><br></div><div><div class="gmail_extra"><div class="gmail_quote">On Wed, Dec 27, 2017 at 9:15 AM, Alberto Valverde <span dir="ltr"><<a href="mailto:alberto@toscat.net" target="_blank">alberto@toscat.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hi,<div><br></div><div>I'm manage to link statically all haskell libraries to a dynamically loadable postgreSQL extension written in haskell using:</div><div><br></div><div>SRC_HC_OPTS += -fPIC</div><div>SRC_CC_OPTS += -fPIC</div><div><br></div><div>in <a href="http://build.mk" target="_blank">build.mk</a> and passing these options to every package cabal builds:</div><div><br></div><div>--ghc-option=-fPIC --ghc-option=-optc-fPIC</div><div><br></div><div>I'm using nix but it should work in any environment if you make sure every package cabal build gets these options (maybe by setting them in $HOME/.cabal/config?)</div><div><br></div><div>HTH,</div><div>Alberto</div></div><div class="gmail_extra"><br><div class="gmail_quote"><div><div class="gmail-h5">On Tue, Dec 26, 2017 at 9:11 PM, Viacheslav Lotsmanov <span dir="ltr"><<a href="mailto:lotsmanov89@gmail.com" target="_blank">lotsmanov89@gmail.com</a>></span> wrote:<br></div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div class="gmail-h5">
  
    
  
  <div bgcolor="#FFFFFF">
    <p>Hi there. My actual main goal is to build my own shared library
      written in Haskell that would be compatible with application
      written in C even without knowing that is is written in Haskell.
      So for now I compiled my shared library but I only could
      dynamically link it to Haskell dependencies such as "base" and
      "ghc-prim" packages. But I want to statically link Haskell
      dependencies but I realized it isn't simple and straightforward
      task.</p>
    <p>On Freenode's #haskell I was advised I should build GHC from
      scratch with -fPIC, on the Linux (I'm using Fedora Workstation 25
      on x86_64) I couldn't go forward without this step. So I wrote
      some Dockerfile based on Debian 9, skipping first part which is
      containing 'apt-get update' and installing 'build-essential' here
      is what I have:</p>
    <tt>COPY <a href="http://my-build.mk" target="_blank">my-build.mk</a> /<a href="http://my-build.mk" target="_blank">my-build.mk</a></tt><tt><br>
    </tt><tt><br>
    </tt><tt>RUN mkdir /compile && cd /compile \</tt><tt><br>
    </tt><tt>    && wget
      <a class="gmail-m_-3108370329929368587m_1732321520409461621moz-txt-link-freetext" href="https://downloads.haskell.org/~ghc/8.2.2/ghc-8.2.2-src.tar.xz" target="_blank">https://downloads.haskell.org/<wbr>~ghc/8.2.2/ghc-8.2.2-src.tar.x<wbr>z</a> \</tt><tt><br>
    </tt><tt>    && tar -xvf ghc-8.2.2-src.tar.xz \</tt><tt><br>
    </tt><tt>    && rm ghc-8.2.2-src.tar.xz \</tt><tt><br>
    </tt><tt>    && cd ghc-8.2.2/ \</tt><tt><br>
    </tt><tt>    && ./configure --prefix=/ghc-8.2.2-fpic
      --disable-library-profiling --enable-shared \</tt><tt><br>
    </tt><tt>    && cp /<a href="http://my-build.mk" target="_blank">my-build.mk</a> mk/<a href="http://build.mk" target="_blank">build.mk</a> \</tt><tt><br>
    </tt><tt>    && make install \</tt><tt><br>
    </tt><tt>    && cd /usr/local/bin \</tt><tt><br>
    </tt><tt>    && ls /ghc-8.2.2-fpic/bin/ | xargs -I{} ln -s
      /ghc-8.2.2-fpic/bin/{}</tt><br>
    <p>And as you can see I just use my own prepared <i><a href="http://my-build.mk" target="_blank">my-build.mk</a></i>
      file which is:</p>
    <tt>SRC_HC_OPTS          = -H64m -O</tt><tt><br>
    </tt><tt>EXTRA_HC_OPTS        = -fPIC</tt><tt><br>
    </tt><tt>SRC_CC_OPTS          = -fPIC -O</tt><tt><br>
    </tt><tt>GhcStage1HcOpts      = -fasm -O0</tt><tt><br>
    </tt><tt>GhcStage2HcOpts      = -fasm -O0</tt><tt><br>
    </tt><tt>GhcLibHcOpts         = -fasm -O2</tt><tt><br>
    </tt><tt>GhcLibWays           = v dyn</tt><tt><br>
    </tt><tt>DYNAMIC_GHC_PROGRAMS = YES</tt><tt><br>
    </tt><tt>DYNAMIC_BY_DEFAULT   = NO</tt><tt><br>
    </tt><tt>SplitObjs            = NO</tt><tt><br>
    </tt><tt>HADDOCK_DOCS         = NO</tt><tt><br>
    </tt><tt>BUILD_DOCBOOK_HTML   = NO</tt><tt><br>
    </tt><tt>BUILD_DOCBOOK_PS     = NO</tt><tt><br>
    </tt><tt>BUILD_DOCBOOK_PDF    = NO</tt><tt><br>
    </tt><tt>V                    = 1</tt><tt><br>
    </tt><tt>LATEX_DOCS           = NO</tt><tt><br>
    </tt><tt>HSCOLOUR_SRCS        = NO</tt><tt><br>
    </tt><tt>BeConservative       = YES</tt>
    <p>I just combined it from parts I found in the internet during
      searching answers to my questions. So I built this container, I
      also installed dependencies by this commands:</p>
    <tt>cd /mnt</tt><tt><br>
    </tt><tt>cabal update</tt><tt><br>
    </tt><tt>cabal sandbox init</tt><tt><br>
    </tt><tt>cabal install --enable-shared --ghc-option=-fPIC happy alex</tt><tt><br>
    </tt><tt>cabal install --enable-shared --ghc-option=-fPIC
      base-unicode-symbols filepath process directory lens containers
      qm-interpolated-string</tt><br>
    <p>And when I tried to build my app by following commands (first
      command compiles some C-code to automatically initialize Haskell
      runtime, see link posted below, not sure if <i>-static</i>, <i>-shared</i>
      or <i>-fPIC</i> means something here but it's work in progress):</p>
    <tt><span class="gmail-m_-3108370329929368587m_1732321520409461621pl-s">ghc -static -shared -fPIC -optc-DMODULE=Foo
        src/lib-autoinit.c -outputdir builddir<br>
        ghc </span></tt><tt><span class="gmail-m_-3108370329929368587m_1732321520409461621pl-s"><span class="gmail-m_-3108370329929368587m_1732321520409461621pl-s">-package-db=SOME_CABALS_SANDBO<wbr>X_PKGDB_DIR
        </span>--make<span class="gmail-m_-3108370329929368587m_1732321520409461621pl-pds"></span></span></tt><tt> </tt><tt><span class="gmail-m_-3108370329929368587m_1732321520409461621pl-s"><span class="gmail-m_-3108370329929368587m_1732321520409461621pl-pds"></span>-static<span class="gmail-m_-3108370329929368587m_1732321520409461621pl-pds"></span></span></tt><tt> </tt><tt><span class="gmail-m_-3108370329929368587m_1732321520409461621pl-s"><span class="gmail-m_-3108370329929368587m_1732321520409461621pl-pds"></span>-shared<span class="gmail-m_-3108370329929368587m_1732321520409461621pl-pds"></span></span></tt><tt> </tt><tt><span class="gmail-m_-3108370329929368587m_1732321520409461621pl-s"><span class="gmail-m_-3108370329929368587m_1732321520409461621pl-pds"></span>-fPIC src/Foo.hs
        builddir/src/lib-autoinit.o -o builddir/libfoo.o -isrc
        -outputdir builddir -Wall -O2<br>
      </span></tt>
    <p>I failed with a lot of similar errors like this one:</p>
    <tt>/usr/bin/ld.gold: error:
/ghc-8.2.2-fpic/lib/ghc-8.2.2/<wbr>ghc-prim-0.5.1.1/libHSghc-prim<wbr>-0.5.1.1.a(Classes.o):
      requires dynamic R_X86_64_PC32 reloc against 'stg_ap_0_fast' which
      may overflow at runtime; recompile with -fPIC</tt><br>
    <p>What have I missed? What should I do to make this happen?</p>
    <p>Any progress could be found here (Dockerfile, sources of modules,
      build-scripts):
<a class="gmail-m_-3108370329929368587m_1732321520409461621moz-txt-link-freetext" href="https://github.com/unclechu/haskell-experiment-shared-library-for-c-application" target="_blank">https://github.com/unclechu/ha<wbr>skell-experiment-shared-librar<wbr>y-for-c-application</a><br>
      Related stack overflow issue:
<a class="gmail-m_-3108370329929368587m_1732321520409461621moz-txt-link-freetext" href="https://stackoverflow.com/questions/47978884/how-do-i-recompile-ghc-with-fpic" target="_blank">https://stackoverflow.com/ques<wbr>tions/47978884/how-do-i-recomp<wbr>ile-ghc-with-fpic</a><br>
    </p>
  </div>

<br></div></div>______________________________<wbr>_________________<br>
ghc-devs mailing list<br>
<a href="mailto:ghc-devs@haskell.org" target="_blank">ghc-devs@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bi<wbr>n/mailman/listinfo/ghc-devs</a><br>
<br></blockquote></div><br></div>
</blockquote></div><br></div></div></div>