将ELF共享库和自定义binfmt可执行文件加载到相同的Linux地址空间中

时间:2012-10-27 00:04:49

标签: linux memory-management process shared-libraries elf

我正在研究一个在Linux平台上加载和运行自定义二进制格式可执行文件(在我的例子中是PE)的项目。到目前为止,通过首先加载可执行文件,然后加载一个调用可执行文件起始地址然后安全退出的小型ELF共享库,我已经非常成功地完成了这项工作。

但我真的不想因为一些原因而没有自己加载ELF。首先,我使用的共享库是用汇编编写的(我不能使用任何其他东西,因为我没有链接到libc等),这将是非常特定于平台的,我想远离那个并使用C所以我可以编译任何平台。此外,使用Linux的本机ELF加载程序而不是我自己的简化版本将更容易,更安全。

我想知道是否有办法使用我的binfmt处理程序,一个已安装的内核模块来加载我的可执行文件,然后然后要求Linux将我的共享库(及其依赖项)加载到相同的地址空间而不覆盖我的可执行代码。我首先认为uselib系统调用可能有用,但手册页上的描述不清楚这是否符合我的目的:

  

从libc 4.4.4开始,只加载了库“/lib/ld.so”,这样就可以了   这个动态库可以加载所需的剩余库(再次   使用这个电话)。这也是libc5中的事态。

     

glibc2不使用此电话。

我也从未见过它的使用示例,我总是对使用我不理解的系统调用持谨慎态度。

有没有一种方法可以实现我所描述的目标?我是否可以使用Linux的现有功能将共享库(用C语言编写)加载到已包含可执行代码的地址空间中,如果是这样,我怎样才能使用该库而不知道它已被加载到何处?