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

Ole*_*yuk 1 assembly gnu-assembler ld

我正在尝试将游戏转换为苏联 PDP11 兼容机。由于它有严格的内存限制 - 56K RAM,我必须在运行时加载部分代码。这意味着我需要构建几个相互交叉引用符号的二进制模块。我用的是GAS和LD。

有没有办法仅使用这些工具来完成此任务?

例如,一个二进制模块文件想要加载另一个二进制模块,为此它必须知道另一个二进制文件的大小。尺寸可以作为符号使用,如下所示:

.title OtherModule

begin:
  some code
end:

.equiv SizeOfTheOtherModuleInWords, ((end - begin) / 2)
Run Code Online (Sandbox Code Playgroud)

另一个例子,游戏中的每个级别单独加载,并包含从始终驻留在内存中的主引擎调用子例程的代码。


我通过链接器脚本找到了解决方案。我可以使用/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
    }
}
Run Code Online (Sandbox Code Playgroud)

Tim*_*win 5

GNU ld 有一个选项--just-symbols,可以从已经链接的文件中加载符号。