实现运行时库加载器

时间:2012-03-02 16:48:25

标签: dynamic posix osdev

我一直在考虑编写一个dlopen(),dlsym(),dlclose(),dlerror(),就像我的一个嵌入式项目的库一样,甚至不存在C库(我已经编写了自己的库)可在此处找到C / C ++库www.libcaprice.com)。但令我烦恼的是实现这个动态库加载器。我已经看了一下这篇论文:http://www.sco.com/developers/devspecs/gabi41.pdf但我似乎无法解决重新定位以及如何初始化GOT。

首先,我认为应该很容易fopen()一个库,然后遍历ELF头,验证它是一个正确的动态库,然后在使用dlsym()时搜索一些符号。这个问题是库本身需要初始化,或者更具体地说是GOT。还需要进行一些重新定位,以确保事物处于证书范围和分配范围内。

我已经看过这个功能的一些用户空间实现,它们看起来相当长,复杂且没有文档。所以我的问题是:是否有dydl的任何独立的开源实现,这些实现在许可的licene,MIT或公共域下获得许可。否则,如果没有,我将不得不实施自己的,有人能指出我在哪里可以开始的正确方向吗?

请不要链接Application V二进制接口规范,因为我已经阅读了有关动态链接和加载的部分,似乎没有人以可理解的方式解释重定位的概念。

1 个答案:

答案 0 :(得分:0)

有一本名为" Linkers和Loaders"的书籍,以及工具界面标准可执行链接可格式的最新剪辑,它可以让您更接近实现动态加载器所需的内容。这本书可能已绝版,但可以在下面免费获得:

http://www.iecc.com/linker/

另一方面,如果您正在寻找glibc实现,它主要保存在glibc源目录内的dlfcn目录中。一个可能有趣的起点是dlfcn / dlopen.c