有没有办法在不链接的情况下使用其他二进制文件中的全局符号
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
,它需要加载一个已经链接的文件和来自的符号。
我正在尝试为苏联 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
,它需要加载一个已经链接的文件和来自的符号。