3

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

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

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

从 libc 4.4.4 开始,仅加载库“/lib/ld.so”,以便此动态库可以加载所需的其余库(再次使用此调用)。这也是 libc5 的现状。

glibc2 不使用这个调用。

我也从未见过使用它的例子,而且我总是对使用我不理解的系统调用保持警惕。

有没有实现我所描述的好方法?我是否可以使用 Linux 的现有功能将共享库(用 C 编写)加载到已经包含可执行代码的地址空间中,如果可以,我如何在不知道加载位置的情况下使用该库?

4