使用 llvm 后端编译 haskell .ll 文件时出错

2023-12-25

我想使用 ghc 前端和 llvm 后端编译 haskell。

我的 haskell hello.hs 文件中有以下代码:

main = putStrLn "Hello World!"

我使用以下命令用 ghc 编译 hello.hs

ghc -fllvm -keep-llvm-files -force-recomp -hello.hs

它会生成 hello.ll 文件以及其他文件。 然后我尝试将此 .ll 文件编译为 .bc 文件。

llvm-as hello.ll -o hello.bc

然后将此 .bc 文件转换为可执行文件

llc hello.bc -o hello

生成一个可执行文件。问题是当我运行这个文件时我发现以下错误

./hello: line 1: .file: command not found
./hello: line 2: .section: command not found
./hello: line 3: .globl: command not found
./hello: line 4: .align: command not found
./hello: line 5: .type: command not found
./hello: line 6: Main_main2_info:: command not found
./hello: line 8: subq: command not found
./hello: line 9: syntax error near unexpected token `('
./hello: line 9: `                 movq                                                                      
%r13, 112(%rsp)'

当我在 .bc 文件上使用 lli 时,我得到

main function not found in module error

我在 docker 上运行 ghc 和 llvm。我有 llvm 3.4 版本和 ghc 7.6.3 版本。

当我尝试在 Mac 上执行此操作时,会发生“类似”错误。我不知道为什么我会收到此错误。


The llc程序不创建可执行文件。它将 LLVM 字节码编译为本机汇编源(默认情况下)或目标文件。如果你运行:

llc hello.bc -o hello

然后使用文本编辑器检查生成的“hello”文件,您将看到它是一个 Intel 汇编文件,并且您遇到的语法错误是因为您尝试将其作为 shell 脚本运行。

相反,您可以将 LLVM 字节码直接编译为目标文件:

llc hello.bc -filetype=obj -o hello.o

然后尝试将其链接到可执行文件:

ld hello.o -o hello

这会产生一堆链接错误,因为它需要与 Haskell 运行时链接。事实证明,在 Haskell 运行时链接的最佳方法是使用ghc本身进行链接:

ghc hello.o -o hello

请注意,该命令的作用是not实际上重新编译 Haskell 源代码。它只是进行链接。如果您想查看它运行的链接命令,请使用:

ghc -v hello.o -o hello

你就会明白为什么最好将链接保留在ghc!!

最后,完成所有这些之后,您应该能够运行“hello”。完整的命令集是:

$ ghc -fllvm -keep-llvm-files -fforce-recomp hello.hs                                                           
[1 of 1] Compiling Main             ( hello.hs, hello.o )                                                       
Linking hello ...
$ rm hello                                                                                               
$ llvm-as hello.ll -o hello.bc                                                                                  
$ llc hello.bc -filetype=obj -o hello.o                                                                         
$ ghc hello.o -o hello                                                                                          
$ ./hello                                                                                                       
Hello, world!  
$
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 llvm 后端编译 haskell .ll 文件时出错 的相关文章

  • cabal install wx 缺少 C 库

    Env 操作系统 feodra 16 Haskell 平台 wxGTK 开发 GHHC 7 0 4 我正在尝试安装 wxHaskell 阴谋集团安装wx 然后给出这些错误 缺少对外国库的依赖 缺少 C 库 wx baseu 2 8 wx b
  • 管道 - 将多个来源/生产者合并为一个

    我正在使用读取文件sourceFile 但我还需要在处理操作中引入随机性 我认为最好的方法是拥有一个这样的制片人 Producer m StdGen ByteString 其中 StdGen 用于生成随机数 我打算让生产者执行 source
  • 如何从具有函数依赖关系的类型类中获取和使用依赖类型?

    如何从具有函数依赖关系的类型类中获取和使用依赖类型 为了澄清并给出我最近的尝试的一个例子 从我正在编写的实际代码中最小化 class Identifiable a b a gt b where if you know a you know
  • 并行 Haskell - GHC GC 火花

    我有一个正在尝试并行化的程序 带有可运行代码的完整粘贴here http lpaste net 101528 我进行了分析 发现大部分时间都花在findNearest这本质上是一个简单的foldr超过一个大Data Map findNear
  • 如何让 esqueleto 为我生成 SQL 字符串?

    我怎样才能让esqueleto从a生成一个SQL字符串from陈述 的文档toRawSql说 你可以打开持久的查询日志记录 我尝试了所有可能的形式MonadLogger我可以理解 但它从未打印任何 SQL 同一文档还说 手动使用此功能 是可
  • Haskell数据类型转换问题

    我目前正在学习 Haskell 并且一直在编写一些非常简单的程序来练习 我的程序之一是 import System IO main do putStrLn Give me year y lt getLine let res show cal
  • Haskell 中的“修复”是什么?为什么“修复错误”会打印无限字符串?为什么“拿 10 美元修复错误”也有同样的作用?

    长话短说 我在看西蒙 佩顿 琼斯的演讲 https www youtube com watch v re96UgMk6GQ 并且当时21 41 https youtu be re96UgMk6GQ t 1301他引用了一句话 我正在解决一个
  • HASKELL:解决河内塔

    下面的代码解决了 hanoi 使用预定义函数 moveLOD swapLOI 和 swapLID 返回移动列表的问题 MoveLOD 将 1 个圆盘从第一个位置移动到三元组第三个位置中的第三个销钉 此外 包含有关运动信息的字符串会堆积在字符
  • seq在haskell中代表什么

    我是 Haskell 的新手 刚刚进入惰性世界编程 我读到seq函数非常特殊 因为它强制使用严格的评估 以便在某些情况下更加有效 但我就是找不到什么seq代表字面意思 也许严格评估Q 它应该提醒您 顺序 或 顺序 因为它允许程序员指定其参数
  • monadicIO 的工作原理

    我有以下代码 fastShuffle a gt IO a fastShuffle a
  • 带有参考的 Haskell 数据类型

    我正在实现 Ukkonen 的算法 该算法要求树的所有叶子都包含对同一整数的引用 并且我在 Haskell 中执行此操作是为了了解有关该语言的更多信息 但是 我很难编写出执行此操作的数据类型 Node has children indexe
  • 在不同上下文中使用的多态变量 haskell

    我有以下一段 Haskell 代码 foo Num a gt a gt a gt Either Integer Double gt Either Integer Double foo f x case x of Left i gt Left
  • 在 Haskell 中证明“没有腐败”

    我所在的行业对安全要求很高 我们的软件项目一般都会有安全要求 我们必须证明该软件具有高度确定性 通常这些都是负面的 例如 腐败的频率不得超过 1 我要补充的是 这些要求来自统计系统安全要求 损坏的根源之一显然是编码错误 我想使用 Haske
  • 对 F# 中任意嵌套级别的列表求和

    我正在尝试创建一个 F 函数 它将返回列表的总和int任意嵌套 IE 它将适用于list
  • Haskell:去掉 liftM2 中的括号

    如何去掉标有的括号 而不引入新名称 如果能分成多行就更好了 liftM2 somefunc arg1 get arg2 somefunc arg3 get arg3 您可以使用以下方法删除最后一个 但另一个显然不能在不引入新名称的情况下被删
  • 一个目录中的多个 Haskell cabal-packages

    在一个目录中包含多个 cabal 软件包的推荐方法是什么 Why 我有一个包含许多可分离模块的旧项目 由于最初它们只形成一个程序 因此将它们放在同一目录中以便于编译非常方便 而且现在仍然如此 Options 只是忍受并将所有内容 包括保存内
  • Haskell 中动态规划的高效表

    我已经编码了0 1背包问题 http en wikipedia org wiki Knapsack problem 0 1 knapsack problem在哈斯克尔 我对迄今为止所取得的懒惰和普遍性水平感到相当自豪 我首先提供用于创建和处
  • 为自定义镜头编写类别实例

    我一直在读这个article http www haskellforall com 2012 01 haskell for mainstream programmers 28 html用于理解镜头 我知道这不同于 爱德华 克内特 Edwar
  • 如何在递归方案中派生实例

    我正在测试其中的一些想法本文 http blog sumtypeofway com an introduction to recursion schemes 我想派生 Term 类型的 Eq 实例 LANGUAGE DeriveFuncto
  • 如何使用 alex/haskell 执行 python 风格的缩进/缩进标记?

    我正在用 Haskell 为 Alex 中的一种小语言编写一个词法分析器 该语言被指定为具有 python 式的显着缩进 只要缩进级别发生变化 就会发出 INDENT 标记或 DEDENT 标记 在像 C 这样的传统命令式语言中 您将在词法

随机推荐

  • mingw 3.4.5 缺少 dlfcn.h?

    难道是我的mingw 3 4 5安装有问题 还是其他一些图书馆提供了这个 如果您想知道 dlfcn h 是定义 dlopen 和 dlclose 等内容的地方 所以它应该是相当标准的 dlfcn win32 http code google
  • Sonata Admin (2.3) 中的嵌套集合字段

    我在创建用于创建课程的表单时遇到问题 这是我的数据库方案的一部分 我正在尝试为其创建一个表单 所以我想做的是创建一个课程 我可以在其中创建会话和附加到该会话的日期 时刻 它应该看起来像这样 In my 课程管理我有的课 protected
  • 从子 textInputEditText 获取父 textInputlayout

    我正在实现一个功能来更改大小写textInputlayout提示文本为大写当提示浮起时 反之亦然 为此我正在使用OnFocusChangeListener在它的孩子身上textInputEditText 为了使其易于实施 我正在实施View
  • 删除java中的符号链接

    是否有任何 api 可用于使用 java util Date 删除符号链接 Files delete Path 不起作用 请发表您的建议 Files delete Path 在符号链接上完美运行 您的代码中应该还有其他问题 此代码示例有效
  • 如何在 C# 中保存文件和在数据库中插入记录之间创建 Transactionscope

    我有一个问题 保存文件并在 TransactionScope 的数据库中插入记录 表示保存文件和插入记录 必须一起依赖 或两者或两者都不依赖 有人可以帮我吗 事务性 NTFS 最酷的部分之一 事务性 NTFS 是它可以工作 与大量其他 交易
  • JavaScript继承框架

    是否有一个小型 轻量级的 JavaScript 类继承解决方案 可以在客户端和服务器端 node js 上正常工作 我不需要一个大的库 只是需要一个允许我声明构造函数和一些方法 然后让类能够继承它的库 John Resig 用大约 25 行
  • React Router 显示所有路由的一个组件(标头)

    有一个关于 React 路由器的问题 我有一个标题项目 我想为所有路线显示该标题项目 当然 我希望它成为 的一部分 以便用户可以单击导航中的项目 目前我有我的
  • Go 练习之旅 #18:切片、索引超出范围

    我正在完成围棋之旅中的练习 但遇到了一个我无法解决的障碍 我正在做Exercise Slices https tour golang org moretypes 18我收到此错误 256 x 256 panic runtime error
  • 具有多个文本字段输入视图的多个选择器视图 Swift

    我一直在论坛中进行搜索 但没有任何帮助 我在一个视图控制器中使用 4 个文本字段 对于每个文本字段 我使用一个单独的 pickerView 作为文本字段 4pickers 的 inputView 当我单击第一个文本字段时 pickerVie
  • 使用 GraalVM 构建本机应用程序时缺少 cl.exe

    我正在尝试使用 GraalVM 和本机映像构建本机应用程序 启动构建过程时发生错误 类路径中似乎缺少 cl exe 正如 GraalVM 网站上提到的 我已经安装了 GRMSDKX EN DVD iso 适用于 Windows 7 和 NE
  • Arrayformula 在谷歌表格中使用 countif 来计算当前行之前的重复项[重复]

    这个问题在这里已经有答案了 我只需要计算当前行之前的重复项 我需要它位于数组公式中 因为我需要它在添加新行时自动扩展 在 Excel 中 我会使用一个带有类似以下函数的表 COUNTIF A 2 A2 B2 gt 在单元格 C2 中 在单元
  • 使用 AWS CodeBuild 进行 docker 推送失败,退出状态为 1

    我创建了由 CodePipeline 触发的 CodeBuild 项目 并且 docker Push 步骤始终失败 并显示 原因 退出状态 1 错误消息 以下是我的构建日志 将我的组织 ID 替换为 Container 2021 06 12
  • 如何从 GMSMapView 中删除 GMSPolygon

    是否有任何方法可以从 GMSMapView 中删除 GMSPolygons 它似乎不存在包含它们的 GMSMapView 属性 如 GMSPlolyLines 我应该清除地图并再次渲染吗 thanks 当您创建GMSPolygon你设置它的
  • 如何知道窗口是否被“x”按钮关闭?

    有谁知道如何找出wpf窗口是否被 x 按钮关闭 最简单的方法 在我看来 是存储一个布尔值 指示用户是否通过其他方法关闭了表单 然后在 OnClosing 事件中 检查布尔值是否为 false 表示单击了 x 按钮 唯一的问题是您自己设置了布
  • Rails 和 Socket.io (node.js)

    我打算使用 Rails 应用程序来提供由 node js 服务器和 Socket io 处理的实时数据 在 Socket io 网站上 它说 如果您不会利用 Node JS 来提供服务 您的文件 请确保设置 全球的WEB SOCKET SW
  • 从 gradle 扩展访问配置闭包

    我正在编写一个插件 其中执行如下操作 project extensions create myExtension new MyExtension project where MyExtension是定义我的新功能的类 Now in grad
  • 在 RDF 中对数据库 NULL 的等价物进行建模

    我想知道是否有一种标准或普遍接受的方法来表示 RDF 数据数据库中使用的 NULL 的等效项 更具体地说 我对区分以下情况的值感兴趣o财产的p p是谓词 oRDF 三元组的对象 其值为不适用 即财产p不存在或在上下文中没有意义 其值为unk
  • 在 C 中读取 .csv 文件

    我有一个 csv 文件 lp imie nazwisko ulica numer kod miejscowosc telefon email data ur 1 Jan Kowalski ul Nowa 1a 11 234 Budry 12
  • 内存屏障的传递性/累积性属性是如何在微架构上实现的?

    我一直在阅读有关 x86 内存模型的工作原理 x86 上屏障指令的重要性以及与其他架构 例如 ARMv8 的比较 在 x86 和 ARMv8 架构中 似乎 没有双关语 内存模型尊重传递性 累积性 即如果 CPU 1 看到 CPU0 的存储
  • 使用 llvm 后端编译 haskell .ll 文件时出错

    我想使用 ghc 前端和 llvm 后端编译 haskell 我的 haskell hello hs 文件中有以下代码 main putStrLn Hello World 我使用以下命令用 ghc 编译 hello hs ghc fllvm