可能是重复问题:
从内存中加载dlopen?
我已经看到了Windows的DLL文件,可以从内存缓冲区加载,但我在Linux上找不到它的任何地方,“ld”源代码是我见过的最复杂的代码。所以:
有没有加载.so文件的内存示例? 即使是简单的一个也可以,我只是不知道从哪里开始,即使我已经阅读了大部分ELF规范,它对我来说仍然神秘。
可能是重复问题:
从内存中加载dlopen?
我已经看到了Windows的DLL文件,可以从内存缓冲区加载,但我在Linux上找不到它的任何地方,“ld”源代码是我见过的最复杂的代码。所以:
有没有加载.so文件的内存示例? 即使是简单的一个也可以,我只是不知道从哪里开始,即使我已经阅读了大部分ELF规范,它对我来说仍然神秘。
ld
不执行程序和库加载。相反,您应该查看libc中找到的dlopen
和dlsym
函数的源代码。此外,您应该查看动态链接器的源代码:ld-linux.so(真实名称因平台而异;执行ldd /bin/ls
以查找动态链接器所在位置)。对于你来说,“从内存中加载.so
文件”是什么意思?
如果您有任何*.so
文件,那么它在某个文件系统中并且有一个路径。然后只需在其上使用dlopen
。
如果它不是一个文件,那它是什么?您是如何将其存储到内存中的?您确切地拥有什么在内存中?(在内存中是否有ELF头和ELF布局?)
如果您有足够的信息来生成ELF *.so
文件,请将此类文件转储(即写入)到某个文件系统中(如果您关心磁盘性能,请使用临时文件系统,如tmpfs
)。 然后在其上使用dlopen
。
如果你没有足够的信息来制作一个 ELF .so
文件,那么你很可能是在内存中动态构建代码。看看现有的机器代码生成基础设施(如 LLVM, GCCJIT, libjit, GNU lightning, LuaJit ....)在做什么。
.so
文件"(或者说从内存中加载任何类型的文件)的确切含义,因为文件只能从文件系统中读取。我猜测在Windows上有这样的函数是因为(如果我没记错的话)在Windows上有几个进程不能同时对一个文件进行操作(例如,在Windows上无法删除另一个进程打开的文件,但在Linux上可以这样做)。 - Basile Starynkevitchdlopen()
文件,而不是从磁盘上加载。注意不改变原意,简化表达。 - Dan Fegommap
)的文件描述符中获取.so
ELF文件的内容,唯一明智的选择就是将其写入文件,然后使用dlopen
打开该文件。 - Basile Starynkevitch