2402d,d的静态构造器
原文
在D中是如何实现的静态构造器
?印象是,druntime
启动代码遍历
,在可执行
文件中存储的某种表
.但显然
这是依赖
操作系统的,我试让静态构造器
在wasm
中工作,但找不到
方法.
我研究的druntime
代码都勾挂
到依赖于可执行格式
的东西,显然还没有wasm
的.
这在wasm
中甚至可能吗,或我是否遗漏了一些明显的东西
它主要依赖于二进制格式
,是编译器
和druntime
之间的合作.
一般,编译器发射
不可链接时
去掉的指向生成
的ModuleInfo
结构的指针
到一个(__minfo,.minfo
等)特殊节,把每个.d
模块编译
到特定的目标文件
中.
链接到可执行文件/共享库
后,在数据段的命名节
中连续存储
每个链接目标
文件的所有.d
模块的ModuleInfo
指针.
这样,druntime
可通过取ModuleInfo
指针的数据区间
(如,通过链接器
生成的__{start,stop}___minfo
的ELF
括号符号)来反射链接
到二进制文件
的所有D模块/ModuleInfos
.从那里可推导出模块构造器
,单元测试
等.
这在
wasm
中甚至可能吗,还是我错过了一些明显的东西
LDC
有个外来平台
的回退
,它使用链表
和编译器
生成的,在初化程序
时(按未定义的顺序)插入ModuleInfo
指针,由C运行时
,在Cmain()
之前调用的CRT
构造器.
因此,如果wasm
不支持命名节/数据区间
,但"隐式"
支持可能潜在路线的初化器
函数(CRT
构造器).
哦,好吧,wasm-ld
(即lld
)支持与ELF
完全相同的神奇__{start,stop}_*
符号:这里
哦,伙计,我甚至为此添加了一个LDC
测试,但差不多4年前就忘记了.😄
这里