有没有办法在不链接的情况下使用其他二进制文件中的全局符号

Is there way to use global symbols from other binary without linking it in

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

GNU ld 有选项 --just-symbols,它需要加载一个已经链接的文件和来自的符号。