我正在开发一个项目来加载和运行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可执行文件的信息的链接.
我希望这有帮助.