2013-03-04 108 views
3

假设我有两个可执行文件需要在同一个地址空间中加载到不同的地址。我想保留两个可执行文件作为单独的文件,但允许从另一个文件调用函数。链接单独的二进制文件

例如,如果可执行A,其具有位于0x1000被加载,含有0x1ABC和可执行B,在为0x2000加载的函数void foo(),来电foo(),我希望这样的最终成为call 0x1ABC可执行B.

我需要这个的原因是玩具操作系统。我需要我的引导程序来知道我的中断处理程序的位置以及内核代码的启动位置。我可能能够将整个事物压缩成一个文件,但我宁愿不要。

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

回答

0

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

例如,如果foo.o想从bar.o调用一个函数,链接器脚本构建foo.bin不包括在其bar.o任何代码必须

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

    . = 0x2000; 
    bar (NOLOAD) : { bar.o (*) } 
} 
0

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