可能重复:
dlopen from memory?
我已经看到这个用于Windows的DLL文件,从内存缓冲区加载,但我无法在Linux的任何地方找到它,而“ld”源代码是我见过的最复杂的代码。所以:
是否有任何从内存中加载.so文件的示例?即便是一个我能完成的简单的?我只是不知道从哪里开始,即使我已经阅读了大部分的ELF规格,但对我来说仍然是个秘密。
答案 0 :(得分:8)
您正在查看错误信息的源代码:ld
不执行程序和库加载。相反,您应该查看libc中找到的dlopen
和dlsym
函数的源代码。此外,您应该查看动态链接器的来源: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
文件,那么您可能正在内存中动态构建代码。看看现有的机器代码生成基础架构(例如LLVM,GCCJIT,libjit,GNU lightning,LuaJit ....)正在做什么。
答案 2 :(得分:-1)
你需要dlopen()系列函数(在GNU / Linux上,它们在/usr/include/dlfcn.h中定义)。
例如,请查看how PHP does modules。