gpt4 book ai didi

macos - 如何编译导出符号的 Haskell Mach-O 可执行文件?

转载 作者:行者123 更新时间:2023-12-01 04:28:25 24 4
gpt4 key购买 nike

如何在 macOS 10.14.5 上使用 GHC >=8.2.1(最好是 8.6.*)编译 Haskell 可执行文件(不是库),成功 foreign export是一个函数(即将它作为二进制文件中的公共(public)符号公开)?这适用于 GHC 8.0.2,但不适用于更高版本。

我已经在 ghc 8.0.2(通过堆栈)、8.2.2(通过 nix 和堆栈)、8.4.4(通过 nix 和堆栈)和 8.6.4(通过 nix 和堆栈)上尝试过这个。只有 8.0.2 有效。我知道 8.2 引入了这个变化:GHC will now use ld.gold or ld.lld instead of the system’s default ld , if available.但我不清楚 8.0.2 是否会首先使用不同的“系统默认”ld(darwin 的 ld 与 llvm 的 lld?)。我知道ghc的-pgml [ld-program-here]设置链接器的选项,但我无法手动将其设置为已成功编译并链接任何内容以进一步测试的任何内容。

我有这个文件Main.hs :

module Main where

import Foreign.C

foreign export ccall "my_square" my_square :: CInt -> CInt

my_square :: CInt -> CInt
my_square x = x * x

main :: IO ()
main = putStrLn "FFI Test"

使用 ghc 8.0.2:
> rm Main.hi Main.o && ghc-8.0.2 Main.hs && nm -g Main | grep my_square
[1 of 1] Compiling Main ( Main.hs, Main.o )
[some apparently unrelated clang warnings]
Linking Main ...
[further clang warnings]
2544:0000000100001260 T _my_square

在 ghc 8.6.4 中,该符号似乎没有被导出,因此将来尝试使用该符号链接(symbolic link)另一个程序会失败。
> rm Main.hi Main.o && ghc-8.6.4 Main.hs && nm -g Main | grep my_square
[1 of 1] Compiling Main ( Main.hs, Main.o )
Linking Main ...

最佳答案

与我在评论中所说的不同,您测试的 GHC 版本都没有实际导出 _my_square来自 Main .相反,他们导出 _my_square来自 Main.o (这就是为什么您可以使用 ghc 来编译和链接使用 .cmy_square 文件)。当Main.o链接到最终 Main可执行文件,GHC 都不告诉链接器导出 _my_square . GHC 8.6.4(我认为,从 8.2 开始)告诉链接器去除未使用的、未导出的符号,所以 _my_square蒸发。 GHC 8.0.2 没有,留下 _my_sqaureMain纯属意外可执行。

您可以告诉 GHC 告诉链接器保留该符号。链接器选项是 -exported_symbol <symbol> .我的 GHC 实际上是通过 gcc 调用链接器。 ,所以我必须用 -Wl 包装这两个参数.无论出于何种原因,将该选项传递给 GHC 实际编译 Main.hs导致错误;你必须做Main.o只调用一次 GHC,然后再次调用 GHC 将其链接到 Main ,这次使用链接器选项。也许这是我的系统所特有的——你可以尝试找到更好的方法。

$ ghc -c Main.hs
# Makes Main.hi Main.o Main_stub.h
$ ghc -optl-Wl,-exported_symbol -optl-Wl,_my_square Main.o -o Main
# Makes Main
$ objdump -t Main | grep _my_square
0000000100000dc0 g F __TEXT,__text _my_square

我仍然建议提交 GHC 问题以使其更容易。

关于macos - 如何编译导出符号的 Haskell Mach-O 可执行文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56305512/

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