有没有办法使用其他二进制文件中的全局符号而无需将其链接到

时间:2019-06-15 10:37:29

标签: assembly ld gas

我正在尝试为兼容苏联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
    }
}

1 个答案:

答案 0 :(得分:2)

GNU ld具有选项--just-symbols,该选项将加载已经链接的文件以及来自其中的符号。