<分区>
Possible Duplicate:
dlopen from memory?
我在 Windows 的 DLL 文件中看到过这个,从内存缓冲区加载,但我在 Linux 的任何地方都找不到它,“ld”源代码是我见过的最复杂的代码。所以:
有没有从内存中加载.so文件的例子?即使是我能完成的简单的?我只是不知道从哪里开始,尽管我已经阅读了大部分 ELF 规范,但它对我来说仍然很神秘。
标签 c linux shared-objects
<分区>
Possible Duplicate:
dlopen from memory?
我在 Windows 的 DLL 文件中看到过这个,从内存缓冲区加载,但我在 Linux 的任何地方都找不到它,“ld”源代码是我见过的最复杂的代码。所以:
有没有从内存中加载.so文件的例子?即使是我能完成的简单的?我只是不知道从哪里开始,尽管我已经阅读了大部分 ELF 规范,但它对我来说仍然很神秘。
最佳答案
您正在查看错误事物的源代码:ld
不执行程序和库加载。相反,您应该查看 libc 中的 dlopen
和 dlsym
函数的源代码。另外,你应该看看dynamic链接器的来源:ld-linux.so(真实名称因平台而异;执行ldd/bin/ls
找出动态链接器所在的位置)。
ELF 解析并不难,但需要注意细节并理解特定 CPU 的汇编代码;你还需要你的平台的 ABI 规范(32 位和 64 位 linux 不同,CPU 之间也不同。)
如果你只需要在运行时从内存中加载目标文件(也就是说,它不一定是 SO),你可以看看 X11 项目:他们已经实现了一个模块基本上是在某个地址加载目标代码并重新定位它的系统。
关于c - 从内存中加载 .so 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9016254/