整个共享对象加载到RAM或仅使用符号?

时间:2014-01-06 11:15:59

标签: gcc elf shared-libraries

我目前正在实施基于嵌入式Linux的系统。持久数据从NAND闪存加载。 userland中的第一个应用程序之一是使用libglib的一些功能。对于系统,低启动时间非常重要。

因为glib很大且NAND很慢,所以很多人认为开始速度变慢,因为整个glib必须加载到RAM!我不相信这个“​​都市传奇”。 我的观点是:

  1. gcc链接器支持延迟加载
  2. 共享库的处理方式与内存映射文件类似。因此,整个库不会加载到RAM中,而只会在访问它们时加载包含符号的部分。
  3. 我的假设是否正确,是否有人引用了描述共享对象加载的文本(不是使用GOT进行符号解析,而是“加载”到RAM中)?

    非常感谢提前!

    祝你好运 让 - 皮埃尔

1 个答案:

答案 0 :(得分:1)

  

我的观点是:

     

gcc链接器支持延迟加载

没有“gcc linker”这样的东西,而(静态)链接器与任何东西都没有关系。

  

共享库的处理方式与内存映射文件类似。因此,整个库不会加载到RAM中,而只会在访问它们时加载包含符号的部分。

这是正确的:Linux将从“磁盘”请求分页,因此如果您的磁盘实际上是闪存,并且您不使用压缩文件系统,并且您的共享库是正确构建的,没有文本重定位({{ 1}}),然后只有引用的代码部分和来自库的数据将被分页到RAM中。