gpt4 book ai didi

.net-core - 如何在 CIL .data-declarations 中使用 "&"

转载 作者:行者123 更新时间:2023-12-04 15:09:52 24 4
gpt4 key购买 nike

我正在编写一个针对通用中间语言的编译器,并希望对全局变量使用 .data 声明。我的意思是 Spec 的 II.16.3.1 节.

如何使用所谓的“标签地址”?以下确实使用 .NET-Core 的 ilasm 进行汇编:

.assembly extern mscorlib
{
.ver 4:0:0:0
}
.assembly 'string'
{
}
.module 'string'

.data hello_world_data = { int8(72), int8(101), int8(108), int8(108), int8(111), int8(32), int8(87), int8(111), int8(114), int8(108), int8(100), int8(33), int8(0) }

.field static int8 hello_world at hello_world_data

.data addr_of_data = &(hello_world_data)

.field static int8* hello_world_ptr at addr_of_data

.method public static default int32 main () cil managed {
.entrypoint

ldc.i4.0
ret
}

但是当我尝试执行上面的代码时,我收到以下错误消息(在 Linux 上使用 .NET-Core):

Unhandled exception. System.BadImageFormatException: Could not load file or assembly '/home/lou/uni/proj/stuff/tests/test-global-arrays/string.exe'. An attempt was made to load a program with an incorrect format.

File name: '/home/lou/uni/proj/stuff/tests/test-global-arrays/string.exe'


[1] 12019 abort (core dumped) dotnet string.exe

任何想法/帮助?

最佳答案

如果这对您很重要,我建议在 https://github.com/dotnet/runtime 中提交问题 repo 。

我假设这在 Windows 之外不起作用的原因是因为这些指令生成带有重定位的数据(一旦可执行文件加载到内存中,可执行文件中的位置需要用真实地址修复)。由于 .NET 中可执行文件的格式基于 Windows PE 格式,因此重定位由 Windows 在加载可执行文件时处理。

在 Windows 之外,CoreCLR 附带了一个小型“Windows 加载程序模拟器”,它以 Windows 加载它们的方式加载 .NET 可执行文件。但它可能错过了对这些搬迁的处理。否则 IL 格式不会生成重定位。

但是这些重定位在很多地方都会有问题(我完全期望像 IL 链接器这样的工具会错过它们并损坏它们,我假设 Mono 也没有处理这些,它们会成为问题用于 AOT 编译等)。

关于.net-core - 如何在 CIL .data-declarations 中使用 "&",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65415599/

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