我正在尝试为兼容苏联PDP11的机器转换游戏。由于它具有严格的内存限制-56K RAM,因此我必须在运行时加载部分代码。 这意味着我需要构建几个相互交叉引用符号的二进制模块。 我正在使用GAS和LD。
是否有一种方法可以简单地使用这些工具来实现?
例如,一个二进制模块文件想要加载另一个二进制模块,为此它必须知道另一个二进制文件的大小。 大小可用如下符号表示:
.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
}
}
答案 0 :(得分:2)
GNU ld具有选项--just-symbols
,该选项将加载已经链接的文件以及来自其中的符号。