我正在研究一个在Linux平台上加载和运行自定义二进制格式可执行文件(在我的例子中是PE)的项目。到目前为止,通过首先加载可执行文件,然后加载一个调用可执行文件起始地址然后安全退出的小型ELF共享库,我已经非常成功地完成了这项工作。
但我真的不想因为一些原因而没有自己加载ELF。首先,我使用的共享库是用汇编编写的(我不能使用任何其他东西,因为我没有链接到libc
等),这将是非常特定于平台的,我想远离那个并使用C所以我可以编译任何平台。此外,使用Linux的本机ELF加载程序而不是我自己的简化版本将更容易,更安全。
我想知道是否有办法使用我的binfmt处理程序,一个已安装的内核模块来加载我的可执行文件,然后然后要求Linux将我的共享库(及其依赖项)加载到相同的地址空间而不覆盖我的可执行代码。我首先认为uselib
系统调用可能有用,但手册页上的描述不清楚这是否符合我的目的:
从libc 4.4.4开始,只加载了库“/lib/ld.so”,这样就可以了 这个动态库可以加载所需的剩余库(再次 使用这个电话)。这也是libc5中的事态。
glibc2不使用此电话。
我也从未见过它的使用示例,我总是对使用我不理解的系统调用持谨慎态度。
有没有一种方法可以实现我所描述的目标?我是否可以使用Linux的现有功能将共享库(用C语言编写)加载到已包含可执行代码的地址空间中,如果是这样,我怎样才能使用该库而不知道它已被加载到何处?
答案 0 :(得分:8)
已经有一个名为binfmt_pe的项目(由我!),它是一个内核模块,并且拥有自己的链接器(类似于/ lib / ld)。 check it out here
关于制作模块和加载器/链接器的问题,下面有链接。我还包括有关ELF和PE可执行文件的信息的链接。
我希望这会有所帮助。 :)
制作Linux内核模块的有用信息
有关动态加载/链接的信息
有关ELF和PE格式的信息