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

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

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

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

From libc 4.4.4 on only the library “/lib/ld.so” is loaded, so that
this dynamic library can load the remaining libraries needed (again
using this call). This is also the state of affairs in libc5.

glibc2 does not use this call.

我也从未见过它的使用示例,我总是担心使用我不理解的系统调用.

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

解决方法:

已经有一个名为binfmt_pe(由我来做)的项目,它是一个内核模块,并且拥有自己的链接器(类似于/ lib / ld). check it out here.

至于你关于制作模块和加载器/链接器的问题,下面有链接.我还包括有关ELF和PE可执行文件的信息的链接.

我希望这有帮助.

上一篇:基本修养实战篇(七) 程序的装载 【进行中】


下一篇:CSS 转换