在我工作的嵌入式设备,启动时间是一个重要的问题。 整个应用程序由使用一组库的几个可执行文件。 由于闪存空间是有限的,我们想用共享库。
照常编译和共享库和FLASH存储器的量连接时,应用程序workes如预期被减少。 被链接到静态库的版本不同的是,应用程序的启动时间是20s左右长,我不知道为什么。
该应用程序在180兆赫的Linux OS 2.6.17,16 MB FLASH(JFFS文件系统)和32 MB RAM的CPU ARM9上运行。
在我工作的嵌入式设备,启动时间是一个重要的问题。 整个应用程序由使用一组库的几个可执行文件。 由于闪存空间是有限的,我们想用共享库。
照常编译和共享库和FLASH存储器的量连接时,应用程序workes如预期被减少。 被链接到静态库的版本不同的是,应用程序的启动时间是20s左右长,我不知道为什么。
该应用程序在180兆赫的Linux OS 2.6.17,16 MB FLASH(JFFS文件系统)和32 MB RAM的CPU ARM9上运行。
Bacause共享库具有在运行时链接到,通常通过dlopen()的或类似的东西。 还有对于静态库,没有这样的一步。
编辑:一些更多的细节。 dlopen的必须执行以下任务。
这需要相当大量的IO操作来完成。
在静态链接程序的所有以上是在编译时进行,而不是运行时。 因此它的速度更快加载一个静态链接程序。
在你的情况,不同的是由相对缓慢的硬件代码必须运行在夸张。
这是速度和空间的经典权衡的一个很好的例子。
您可以静态链接所有的可执行文件,使他们更快,但随后他们将采取更多的空间
要么
你可以有共同的是需要更少的空间,但也有更多的时间来加载库。
所以决定要牺牲什么。
有很多因素造成这种差异(操作系统,编译器等),但原因良好的名单,可以发现在这里 。 基本上,共享库是为空间的原因创建和很多的参与,使他们的工作“神奇”需要一个性能命中。
(作为一个历史说明在Linux / Unix原来的Netscape Navigator是一个静态链接的大胖子可执行文件)。
这可以帮助其他有类似的问题:
为什么启动我的情况下花了这么长时间的原因是,海湾合作委员会的默认设置是所有符号导出库里面。 有了很大的改进是设置一个编译器设置“-fvisibility =隐藏”。
该LIB拥有自营出口的所有符号必须与语句增强
__attribute__ ((visibility("default")))
看到GCC维基
和非常精细的文章如何写共享库
好了,我现在已经了解到,共享库的使用有关于它的速度的disadvatages。 我发现这篇文章关于动态链接和加载 enlighting。 加载过程似乎是更长得多比我的预期。
有趣的。对于一个共享库通常加载时间是从脂肪应用程序,静态链接不明显。 所以,我只能猜测,该系统要么非常缓慢的加载从闪存,或者是装在某种程度上正在检查的库库(例如.NET应用程序运行的所有加载的DLL的校验,减少启动时间大大的一些案例)。 这可能是共享库被加载视需要,事后卸载这可能表明配置问题。
所以,对不起,我忍不住说为什么,但我认为它的问题与你的ARM设备/ OS。 您是否尝试过插装的启动代码,或最常用的图书馆1静态链接,看看是否是有很大的差异。 也把共享库在同一个目录中的应用程序,以减少需要搜索的FS的LIB的时间。
这似乎明显,我的一个选择,是几个项目静态链接全部变成一个单一的二进制。 这样,你继续分享尽可能多的代码尽可能(可能比以前更多),但你也将避免动态链接程序的开销,并保存其对系统的动态链接器在所有的空间。
这是很容易一些可执行文件合并到同一个,你通常只检查的argv和决定基于呼叫上哪个例程。