3

假设我有两个可执行文件需要加载到不同地址的相同地址空间中。我想将这两个可执行文件保存为单独的文件,但允许一个调用另一个函数。

例如,如果必须在 0x1000 加载的可执行文件 Avoid foo()在 0x1ABC 包含一个函数,而在 0x2000 加载的可执行文件 B 调用foo(),我希望它以call 0x1ABC可执行文件 B的形式结束。

我需要这个的原因是为了玩具操作系统。我需要我的引导加载程序知道我的中断处理程序在哪里以及内核代码从哪里开始。我也许可以将整个内容压缩到一个文件中,但我宁愿不这样做。

目前,我通过在“好”地址手动加载所需功能并手动将跳转写入它们来解决问题。它有效,但是,不用说,它不是最理想的。

4

2 回答 2

0

一种选择是通过第二条路径提供函数的地址。例如,这可以是一个文件,也可以是一个固定的内存地址。如果您可以完全控制系统,那么最后一个版本应该可以正常工作。

于 2013-03-04T14:40:36.937 回答
0

我好像找到了。在 ld 链接器脚本中,有一个(NOLOAD)可以假定已驻留在内存中的部分的选项。

例如,如果foo.o要从 调用函数,则要bar.o构建的链接描述foo.bin文件不包含其中的任何代码bar.o

SECTIONS
{ 
  . = 0x1000;
  foo : { foo.o (*) }

  . = 0x2000;
  bar (NOLOAD) : { bar.o (*) }
}
于 2013-03-04T16:19:00.447 回答