Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 有没有办法使用其他二进制文件中的全局符号而不将其链接进来_Assembly_Ld_Gnu Assembler - Fatal编程技术网

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

Assembly 有没有办法使用其他二进制文件中的全局符号而不将其链接进来,assembly,ld,gnu-assembler,Assembly,Ld,Gnu Assembler,我正在尝试将一个游戏转换为与苏联PDP11兼容的机器。由于它有严格的内存限制-56K的RAM,我必须在运行时加载部分代码。 这意味着我需要构建几个相互引用符号的二进制模块。 我用的是汽油和LD 有没有一种方法可以简单地使用这些工具来实现这一点 例如,一个二进制模块文件想要加载另一个二进制模块,为此它必须知道另一个二进制模块的大小。 尺寸可作为如下符号使用: .title OtherModule begin: some code end: .equiv SizeOfTheOtherModu

我正在尝试将一个游戏转换为与苏联PDP11兼容的机器。由于它有严格的内存限制-56K的RAM,我必须在运行时加载部分代码。 这意味着我需要构建几个相互引用符号的二进制模块。 我用的是汽油和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
,该选项将加载一个已链接的文件并从中提取符号。

GNU ld有一个选项
——just symbols
,该选项将加载一个已链接的文件并从中提取符号。

您可以查看2.11BSD附带的工具链。它包含一个链接器,可以从对象文件生成覆盖,自动管理此交换。代码将在内存中没有操作系统的情况下运行。无论如何,机器使用RT-11操作系统,Ld生成的二进制文件格式与RT-11不兼容。我必须对它们进行转换,以使它们能够被RT-11装载。在使用GNU工具链生成二进制文件时,也需要这样做。我不确定覆盖代码是如何工作的,但我想它可以在没有操作系统的机器上使用或调整。你想要构建的是覆盖。我想告诉您的是,通过使用现有的实现,您可以避免构建自己的覆盖。@OlegTsymbalyuk这就是覆盖的全部意义(您可以使用链接器脚本制作):这些将程序拆分为多个覆盖,一次只将其中一个加载到内存中。通常,所有覆盖都被捆绑到磁盘上的一个文件中,但也可以将每个覆盖都放在自己的文件中。据我所知,GNU链接器无法完全满足您的需求,但正如我所说,使用覆盖层可以更轻松地实现最终目标。您可以查看2.11BSD附带的工具链。它包含一个链接器,可以从对象文件生成覆盖,自动管理此交换。代码将在内存中没有操作系统的情况下运行。无论如何,机器使用RT-11操作系统,Ld生成的二进制文件格式与RT-11不兼容。我必须对它们进行转换,以使它们能够被RT-11装载。在使用GNU工具链生成二进制文件时,也需要这样做。我不确定覆盖代码是如何工作的,但我想它可以在没有操作系统的机器上使用或调整。你想要构建的是覆盖。我想告诉您的是,通过使用现有的实现,您可以避免构建自己的覆盖。@OlegTsymbalyuk这就是覆盖的全部意义(您可以使用链接器脚本制作):这些将程序拆分为多个覆盖,一次只将其中一个加载到内存中。通常,所有覆盖都被捆绑到磁盘上的一个文件中,但也可以将每个覆盖都放在自己的文件中。据我所知,GNU链接器无法完全满足您的需求,但正如我所说的,使用覆盖层可以更轻松地实现最终目标。此选项也适用于GNU
As
生成的对象文件:)稍后我可能会尝试使用覆盖层,但您的答案正是我真正寻找的答案。谢谢此选项也适用于GNU
生成的对象文件:)稍后我可能会尝试使用覆盖,但您的答案才是我真正搜索的答案。谢谢