假设STG生成自定义ABI,Haskell链接可能如何工作



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

链接器是如何工作的?GHC使用自定义链接器吗?

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

正如@arrowd在评论中提到的,链接器实际上并不太关心调用约定。在大多数情况下,它只是修复了对其他对象文件中符号的未定义引用,无论这些符号是引用代码还是数据。

当Haskell模块被编译为本地代码时,它主要采用一堆数据结构("闭包"(和以元数据为前缀的代码片段("信息块"(的形式,并且数据和代码用全局符号标记,这些符号可以被其他模块引用并由链接器解析,在链接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生成以下信息块和闭包(通过删除一些额外的汇编杂注来简化(。

;; 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由模型中的代码和数据引用,成为必须解析的未定义符号。

使用该CCD_ 11函数的另一个调用模块通常将通过对符号CCD_。链接器将解析从调用模块到Foo模块中Foo.foo_closure标签的引用,还将解析从Foo模块到GHC基本包中标签GHC.Base.const_closure的引用。

相关内容

  • 没有找到相关文章

最新更新