Assembly 有没有办法使用其他二进制文件中的全局符号而不将其链接进来
我正在尝试将一个游戏转换为与苏联PDP11兼容的机器。由于它有严格的内存限制-56K的RAM,我必须在运行时加载部分代码。 这意味着我需要构建几个相互引用符号的二进制模块。 我用的是汽油和LD 有没有一种方法可以简单地使用这些工具来实现这一点 例如,一个二进制模块文件想要加载另一个二进制模块,为此它必须知道另一个二进制模块的大小。 尺寸可作为如下符号使用:Assembly 有没有办法使用其他二进制文件中的全局符号而不将其链接进来,assembly,ld,gnu-assembler,Assembly,Ld,Gnu Assembler,我正在尝试将一个游戏转换为与苏联PDP11兼容的机器。由于它有严格的内存限制-56K的RAM,我必须在运行时加载部分代码。 这意味着我需要构建几个相互引用符号的二进制模块。 我用的是汽油和LD 有没有一种方法可以简单地使用这些工具来实现这一点 例如,一个二进制模块文件想要加载另一个二进制模块,为此它必须知道另一个二进制模块的大小。 尺寸可作为如下符号使用: .title OtherModule begin: some code end: .equiv SizeOfTheOtherModu
.title OtherModule
begin:
some code
end:
.equiv SizeOfTheOtherModuleInWords, ((end - begin) / 2)
另一个例子是,游戏中的每个关卡分别加载,并包含从总是驻留在内存中的主引擎调用子程序的代码
我通过链接器脚本找到了一个解决方案。我可以使用
/DISCARD/
节从链接中排除文件
OUTPUT_FORMAT("binary")
OUTPUT_ARCH(pdp11)
INPUT(core.o bootstrap.o)
OUTPUT(AKU.SAV)
FileSizeCoreWords = ((FileEndCore - FileBeginCore) / 2);
SECTIONS
{
. = 0;
.text :
{
bootstrap.o (.text)
}
.data :
{
bootstrap.o (.data)
}
.bss :
{
bootstrap.o (.bss)
}
/DISCARD/ :
{
core.o
}
}
GNU ld有一个选项
——just symbols
,该选项将加载一个已链接的文件并从中提取符号。GNU ld有一个选项——just symbols
,该选项将加载一个已链接的文件并从中提取符号。您可以查看2.11BSD附带的工具链。它包含一个链接器,可以从对象文件生成覆盖,自动管理此交换。代码将在内存中没有操作系统的情况下运行。无论如何,机器使用RT-11操作系统,Ld生成的二进制文件格式与RT-11不兼容。我必须对它们进行转换,以使它们能够被RT-11装载。在使用GNU工具链生成二进制文件时,也需要这样做。我不确定覆盖代码是如何工作的,但我想它可以在没有操作系统的机器上使用或调整。你想要构建的是覆盖。我想告诉您的是,通过使用现有的实现,您可以避免构建自己的覆盖。@OlegTsymbalyuk这就是覆盖的全部意义(您可以使用链接器脚本制作):这些将程序拆分为多个覆盖,一次只将其中一个加载到内存中。通常,所有覆盖都被捆绑到磁盘上的一个文件中,但也可以将每个覆盖都放在自己的文件中。据我所知,GNU链接器无法完全满足您的需求,但正如我所说,使用覆盖层可以更轻松地实现最终目标。您可以查看2.11BSD附带的工具链。它包含一个链接器,可以从对象文件生成覆盖,自动管理此交换。代码将在内存中没有操作系统的情况下运行。无论如何,机器使用RT-11操作系统,Ld生成的二进制文件格式与RT-11不兼容。我必须对它们进行转换,以使它们能够被RT-11装载。在使用GNU工具链生成二进制文件时,也需要这样做。我不确定覆盖代码是如何工作的,但我想它可以在没有操作系统的机器上使用或调整。你想要构建的是覆盖。我想告诉您的是,通过使用现有的实现,您可以避免构建自己的覆盖。@OlegTsymbalyuk这就是覆盖的全部意义(您可以使用链接器脚本制作):这些将程序拆分为多个覆盖,一次只将其中一个加载到内存中。通常,所有覆盖都被捆绑到磁盘上的一个文件中,但也可以将每个覆盖都放在自己的文件中。据我所知,GNU链接器无法完全满足您的需求,但正如我所说的,使用覆盖层可以更轻松地实现最终目标。此选项也适用于GNUAs
生成的对象文件:)稍后我可能会尝试使用覆盖层,但您的答案正是我真正寻找的答案。谢谢此选项也适用于GNU生成的对象文件:)稍后我可能会尝试使用覆盖,但您的答案才是我真正搜索的答案。谢谢