gpt4 book ai didi

haskell - 鉴于 STG 生成自定义 ABI,Haskell 链接如何工作

转载 作者:行者123 更新时间:2023-12-05 02:30:55 26 4
gpt4 key购买 nike

据我了解,从 STG 生成的代码使用非常自定义的 ABI,甚至具有自定义调用堆栈。

那么链接器是如何工作的呢? GHC 是否使用自定义链接器?

最佳答案

如果您使用 -v 标志运行 ghc 以生成详细的日志记录输出,您将看到它调用 gcc 来执行最终链接。当然,gcc 使用标准系统 ld 链接器,但有一些 GHC 认为有用的额外设置。

正如@arrowd 在评论中提到的,链接器并不真正关心调用约定。在大多数情况下,它只是修复对其他目标文件中符号的 undefined reference ,无论这些符号引用代码还是数据。

当一个 Haskell 模块被编译成本地代码时,它主要采用一堆数据结构(“闭包”)和以元数据为前缀的代码片段(“信息 block ”)的形式,并且这些数据和代码被标记为全局符号,可以由其他模块引用并由链接器解析,与链接 C 程序时可能解析对数据结构或 C 函数的引用的方式相同。

作为一个简单的例子,相当愚蠢的模块:

module Foo where

foo :: (a -> b -> c) -> d -> a -> b -> c
foo f = const f

当使用 ghc -c -O0 -fforce-recomp -ddump-asm Foo.hs 编译时,基本上为 foo 生成以下信息 block 和闭包(通过删除简化一些额外的汇编编译指示)。

;; info block, proceeded by a few quad words of metadata
.section .text
.quad 4294967301
.quad 0
.long 14
.long GHC.Base.const_closure-(Foo.foo_info)+0
Foo.foo_info:
movl $GHC.Base.const_closure,%ebx
jmp stg_ap_p_fast
.size Foo.foo_info, .-Foo.foo_info

;; closure
.section .data
Foo.foo_closure:
.quad Foo.foo_info
.quad 0

符号Foo.foo_infoFoo.foo_closure被模块导出,符号Base.const_closure被代码引用和模型中的数据,成为必须解析的 undefined symbol 。

使用此 foo 函数的另一个调用模块通常会通过对符号 Foo.foo_closure 的引用来执行此操作。链接器将解析从调用模块到 Foo 模块中的 Foo.foo_closure 标签的引用,同时解析来自 Foo 的引用模块到 GHC 基础包中的标签 GHC.Base.const_closure

关于haskell - 鉴于 STG 生成自定义 ABI,Haskell 链接如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71728692/

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