假设我有两个可执行文件需要加载到不同地址的同一地址空间中。我想将两个可执行文件保存为单独的文件,但允许一个人从另一个文件中调用函数。
例如,如果必须以0x1000加载的可执行文件A包含0x1ABC处的函数void foo()
和可执行文件B(在0x2000处加载),则调用foo()
,我希望它最终为可执行文件B中的call 0x1ABC
。
我需要这个的原因是玩具操作系统。我需要我的引导程序来知道我的中断处理程序在哪里以及内核代码的起始位置。我或许可以将整个文件压缩到一个文件中,但我宁愿不这样做。
目前我通过手动在“好”地址加载所需的函数并手动将跳转写入它们来解决问题。它有效,但是,据说,它不是最理想的。
答案 0 :(得分:0)
一种选择是在第二条路径上提供功能的地址。例如,这可以是文件,也可以是固定的内存地址。如果您可以完全控制系统,那么最后一个版本应该可以正常运行。
答案 1 :(得分:0)
我似乎找到了它。在ld链接器中,对于可以假定已驻留在内存中的部分,有一个(NOLOAD)
选项。
例如,如果foo.o
想要从bar.o
调用函数,则构建foo.bin
的链接描述文件不包含bar.o
中的任何代码就会1} p>
SECTIONS
{
. = 0x1000;
foo : { foo.o (*) }
. = 0x2000;
bar (NOLOAD) : { bar.o (*) }
}