使用GHC(+ LLVM)静态链接GMP到Haskell应用程序

16
  1. 我该如何取消对libgmp的动态依赖并从以下代码中实现:

    linux-vdso.so.1 =>  (0x00007fffdccb1000)
    libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007fb01afc1000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb01acc7000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fb01aabe000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb01a8ba000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb01a69d000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb01a2df000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fb01b249000)
    

    至此(目前期望的):

    linux-vdso.so.1 =>  (0x00007fffdccb1000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb01acc7000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fb01aabe000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb01a8ba000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb01a69d000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb01a2df000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fb01b249000)
    

    如何在所有GNU / Linux发行版上以干净和可移植的方式工作(而不会与BSD(包括OS X)相冲突)?

  2. 在针对多个GNU / Linux发行版的单个Haskell二进制文件进行分发时,您是否看到可能导致问题的其他依赖项,如上所述?


  3. 注:


@AndrewMyers 我使用Cabal进行构建。如何部署libgmp?我想要支持至少Windows、Linux、OS X和FreeBSD。如果我需要为每个平台构建一个共享/动态库版本的libgmp来随我的应用程序一起部署,那就太麻烦了。不要搞砸:最好的解决方案不仅适用于单个操作系统;我在考虑是否有人可能建议使用类似“locate libgmp”的东西,并在链接时使用它返回的任何内容,而“locate”在不同的操作系统上表现不同。(您可以根据需要将“locate”替换为其他工具。) - Cetin Sert
你是否真的需要支持快速整数操作?简单整数是否足够? - Thomas M. DuBuisson
1
@ThomasM.DuBuisson,目前来看simple-integer已经足够了。我难道不需要重新编译GHC而只需重新编译我的应用程序就可以使用它吗? - Cetin Sert
@ThomasM.DuBuisson 而在不久的将来,我猜我们会做需要快速 Integer 运算的密码学,因此需要使用 GMP。 - Cetin Sert
@AndrewMyers 给定平台=操作系统+架构,我只想为Linux+x86_64构建一次,即我不希望我的用户处理特定GNU/Linux发行版上GMP的存在或缺失。简而言之,我在某个地方有一个单独的静态版本库,GHC和我的应用程序:我希望GHC将库与我的应用程序静态链接。就这样 :) - Cetin Sert
显示剩余3条评论
1个回答

15
如果你在 GHC 命令中传递 -optl-static -optl-pthread 参数,它将会静态链接所有运行时库的依赖关系,包括 GMP。在 Cabal 文件中设置 ld-options: -static -pthread 也能达到同样的效果。
这意味着你将同时静态链接 glibc 库,但这可能不是一个问题,尽管它可能会显著增加二进制文件的大小。如果这对你来说是个问题,使用类似于 musluClibc 的替代 libc 库应该有所帮助。

1
我不确定。上一次我使用GHC静态链接程序时,如果没有传递相关参数,会出现与pthread符号相关的错误。现在可能已经不再需要了。 - ehird
我尽可能地将一个应用程序静态链接。WindowsOS Xlibgmp被静态编译。Linux:对于ghcld,使用-static就足够了,不需要-pthreadlibc被静态链接,但警告内部使用动态加载的libcFreeBSD:无论我是否使用-pthread,它总是抱怨pthread符号。 - Cetin Sert
我想不久之后我将不得不接受这个答案,因为它能正常工作尽管有警告(或许只在glibc中)。似乎没有什么有效的方法只链接libgmp而不进行全局静态链接。 - Cetin Sert
1
我之前问过一个关于将Yesod部署到Heroku的问题,并得到了这个回答,它可能与你的警告有关。 - asm
@AndrewMyers:没错;使用另一种不需要这种要求的libc就可以避免这种情况。 - ehird

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接