Haskell 静态连接musl与ghc

Haskell 静态连接musl与ghc,haskell,ghc,Haskell,Ghc,我正在尝试使用GHC为用Haskell编写的基于CGI的web应用程序构建一个静态二进制文件,以部署在共享服务器上 我想使用,正如所提到的 不幸的是,这不是一项容易的任务: $ ghc -static -optl-static -pgmc musl-gcc -pgml musl-gcc -L/usr/local/lib app.hs [1 of 1] Compiling Main ( app.hs, app.o ) Linking app... /usr/lib/ghc-

我正在尝试使用GHC为用Haskell编写的基于CGI的web应用程序构建一个静态二进制文件,以部署在共享服务器上

我想使用,正如所提到的

不幸的是,这不是一项容易的任务:

$ ghc -static -optl-static -pgmc musl-gcc -pgml musl-gcc -L/usr/local/lib app.hs
[1 of 1] Compiling Main             ( app.hs, app.o )
Linking app...
/usr/lib/ghc-7.6.3/libHSrts.a(Itimer.o): In function `exitTicker':
(.text+0x1af): undefined reference to `__sysv_signal'
collect2: error: ld returned 1 exit status
我做错了什么?(完整免责声明:我是哈斯克尔的新手(:)


我使用的是Arch Linux、GHC 7.6.3和Network.CGI。

看起来Haskell运行时是针对glibc编译的,但您试图针对musl编译Haskell源代码。通常,您不能在同一个程序中混合使用两个C库

您在这里遇到的具体问题是,glibc为
signal
函数支持两组不同的语义冲突集,以匹配UNIX提供的不同历史版本。它根据您的C代码定义的功能测试宏选择要使用的版本。要在它们之间实际切换,它使用C pre处理器,将程序对
信号的引用替换为对函数版本的引用,该函数具有您所请求的语义(在这种情况下,Haskell运行时对
\uu sysv\u信号的引用)

问题在于musl并没有做同样的事情。它公开了一个与POSIX标准定义的语义相匹配的
signal
版本,并以
signal
的名称公开了它

解决这个问题的正确方法是根据musl的头重新编译Haskell运行时。我不知道是否有人真的尝试过这样做,所以YMMV


请注意,您应该避免将库安装在同一系统目录中,但针对不同的C库进行编译。这样做可能会导致崩溃,因为任何软件试图使用针对冲突的C库编译的多个库,都会遇到与您现在遇到的问题完全不同的变体。您应该ld通常将musl编译并安装到自己的前缀中,然后编译其他库(例如Haskell运行时)针对musl并安装到同一前缀中。这样,musl和glibc库保持干净的分离。

这已经完成;请参阅。但是,看起来需要一个完整的Gentoo chroot来承载编译器,这有点尴尬。实际上,您不需要专门的Gentoo chroot。提供的编译器不是交叉编译器,它本身是一个针对musl编译的二进制文件。因此,它需要一个基于musl的环境来运行。它可以是Gentoo chroot/docker container/lxc container/etc,也可以是任何基于musl的发行版,如Alpine Linux。