从内存加载.so文件

时间:2012-01-26 09:46:47

标签: c linux shared-objects

  

可能重复:
  dlopen from memory?

我已经看到这个用于Windows的DLL文件,从内存缓冲区加载,但我无法在Linux的任何地方找到它,而“ld”源代码是我见过的最复杂的代码。所以:

是否有任何从内存中加载.so文件的示例?即便是一个我能完成的简单的?我只是不知道从哪里开始,即使我已经阅读了大部分的ELF规格,但对我来说仍然是个秘密。

3 个答案:

答案 0 :(得分:8)

您正在查看错误信息的源代码:ld不执行程序和库加载。相反,您应该查看libc中找到的dlopendlsym函数的源代码。此外,您应该查看动态链接器的来源:ld-linux.so(真实名称随平台而变;执行ldd /bin/ls以找出动态链接器所在的位置)。

ELF解析并不困难,但需要注意细节和对特定CPU的汇编代码的理解;您还需要适用于您的平台的ABI规范(对于32位和64位Linux,它也是不同的,并且在CPU之间也是不同的。)

如果您只需要在运行时从内存中加载目标文件(即,它不必是SO),您可以查看X11项目:它们已经实现了一个模块系统,基本上,在某个地址加载目标代码并重新定位。

答案 1 :(得分:1)

“从内存中加载.so个文件”对你意味着什么?

如果您有任何*.so 文件,那么它位于某个文件系统中,并且具有路径。然后只需使用dlopen

如果它不是文件,它是什么?你是如何记忆中的?你记忆中到底是什么? (你在内存中有ELF标题和ELF布局吗?)

如果您有足够的信息来制作ELF *.so文件,请将此类文件转储(即写入)到某个文件系统(如果您关心磁盘性能,请使用tmpfs之类的临时文件系统)。然后dlopen那个。

如果您没有足够的信息来制作ELF .so文件,那么您可能正在内存中动态构建代码。看看现有的机器代码生成基础架构(例如LLVMGCCJITlibjitGNU lightningLuaJit ....)正在做什么。

如果内存中有完整的功能代码,请确保内存可以mmap& mprotect并跳转到它(例如使用函数指针技巧)。

答案 2 :(得分:-1)

你需要dlopen()系列函数(在GNU / Linux上,它们在/usr/include/dlfcn.h中定义)。

例如,请查看how PHP does modules