據我了解,從 STG 生成的代碼使用非常自定義的 ABI,甚至具有自定義呼叫堆疊。
那么聯結器是如何作業的呢?GHC 是否使用自定義聯結器?
uj5u.com熱心網友回復:
如果您ghc使用該-v標志運行以生成詳細的日志記錄輸出,您將看到它呼叫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,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/463067.html
上一篇:【筆記】【JavaScript】JSchallenger-set物件-練習筆記
下一篇:可訪問背景關系資料的折疊索引函子
