我们有一个非常模块化的应用程序,有许多共享对象(.so文件)。一些人认为,在内存/闪存有限的低端平台上,最好将所有内容静态链接到一个大可执行文件中,因为共享对象会增加开销。
您对此有何看法?
此致
敬礼,
Paul
您对此有何看法?
此致
敬礼,
Paul
mmap
和mprotect
系统调用以及加载时至少一个页面错误。加上具有位置独立代码成本:
如果您有一个大型长时间运行的应用程序,则这些成本可能对您根本不重要,除非您在一个小型嵌入式系统上。另一方面,如果您正在编写可能被多次调用以完成短期任务的东西(例如语言解释器),则这些成本可能是巨大的。将所有标准模块放在自己的.so
文件中而不是默认静态链接它们是Perl、Python等启动速度缓慢的原因之一。
就我个人而言,我会选择使用动态加载的模块作为可扩展性工具,而不是作为开发模型。
dlopen(3)
可以加载库。这是否重要将取决于您的用例;为每个编译并比较大小以确定哪个在Flash中更小。您将不得不运行和分析以确定哪个消耗更多RAM;它们应该类似,除了共享库的初始加载。拥有大量的库当然意味着需要存储更多的元数据,而且其中一些元数据(库部分标题等)在加载时需要存储在RAM中。但是差异应该是相当可忽略的,即使在(适度现代的)嵌入式系统上也是如此。
我建议您尝试两种替代方案,并测量FLASH和RAM中使用的空间,然后决定哪种最好。