gpt4 book ai didi

haskell - 将 musl 与 ghc 静态链接

转载 作者:行者123 更新时间:2023-12-02 21:28:35 30 4
gpt4 key购买 nike

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

我想使用musl ,如this answer所述.

不幸的是,这不是一件容易的事:

$ 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

我做错了什么? (完全免责声明:我是 Haskell 新手 (: )

我正在使用 Arch Linux、GHC 7.6.3 和 Network.CGI。

最佳答案

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

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

问题是 musl 不会做同样的轻微 Action 。它公开了与 POSIX 标准定义其语义相匹配的 signal 的单个版本,并以 signal 名称公开它。

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

请注意,您应该避免将库安装在同一系统目录中,但针对不同的 C 库进行编译。这样做可能会破坏事情,因为任何尝试使用针对冲突的 C 库编译的多个库的软件都会遇到您现在遇到的确切问题的变体。你通常应该将 musl 编译并安装到它自己的前缀中,然后针对 musl 编译其他库(例如你的 Haskell 运行时)并安装到相同的前缀中。这样,您的 musl 和 glibc 库就可以完全分开。

关于haskell - 将 musl 与 ghc 静态链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22880650/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com