为什么在Linux上慢的应用程序的启动使用共享库的时候?(Why is the startup of

2019-08-05 04:46发布

在我工作的嵌入式设备,启动时间是一个重要的问题。 整个应用程序由使用一组库的几个可执行文件。 由于闪存空间是有限的,我们想用共享库。

照常编译和共享库和FLASH存储器的量连接时,应用程序workes如预期被减少。 被链接到静态库的版本不同的是,应用程序的启动时间是20s左右长,我不知道为什么。

该应用程序在180兆赫的Linux OS 2.6.17,16 MB FLASH(JFFS文件系统)和32 MB RAM的CPU ARM9上运行。

Answer 1:

Bacause共享库具有在运行时链接到,通常通过dlopen()的或类似的东西。 还有对于静态库,没有这样的一步。

编辑:一些更多的细节。 dlopen的必须执行以下任务。

  • 查找共享库
  • 加载到内存中
  • 递归加载所有的依赖关系(和它们的依赖....)
  • 解决所有的符号

这需要相当大量的IO操作来完成。

在静态链接程序的所有以上是在编译时进行,而不是运行时。 因此它的速度更快加载一个静态链接程序。

在你的情况,不同的是由相对缓慢的硬件代码必须运行在夸张。



Answer 2:

这是速度和空间的经典权衡的一个很好的例子。

您可以静态链接所有的可执行文件,使他们更快,但随后他们将采取更多的空间

要么

你可以有共同的是需要更少的空间,但也有更多的时间来加载库。

所以决定要牺牲什么。

有很多因素造成这种差异(操作系统,编译器等),但原因良好的名单,可以发现在这里 。 基本上,共享库是为空间的原因创建和很多的参与,使他们的工作“神奇”需要一个性能命中。

(作为一个历史说明在Linux / Unix原来的Netscape Navigator是一个静态链接的大胖子可执行文件)。



Answer 3:

这可以帮助其他有类似的问题:

为什么启动我的情况下花了这么长时间的原因是,海湾合作委员会的默认设置是所有符号导出库里面。 有了很大的改进是设置一个编译器设置“-fvisibility =隐藏”。

该LIB拥有自营出口的所有符号必须与语句增强

__attribute__ ((visibility("default")))

看到GCC维基
和非常精细的文章如何写共享库



Answer 4:

好了,我现在已经了解到,共享库的使用有关于它的速度的disadvatages。 我发现这篇文章关于动态链接和加载 enlighting。 加载过程似乎是更长得多比我的预期。



Answer 5:

有趣的。对于一个共享库通常加载时间是从脂肪应用程序,静态链接不明显。 所以,我只能猜测,该系统要么非常缓慢的加载从闪存,或者是装在某种程度上正在检查的库库(例如.NET应用程序运行的所有加载的DLL的校验,减少启动时间大大的一些案例)。 这可能是共享库被加载视需要,事后卸载这可能表明配置问题。

所以,对不起,我忍不住说为什么,但我认为它的问题与你的ARM设备/ OS。 您是否尝试过插装的启动代码,或最常用的图书馆1静态链接,看看是否是有很大的差异。 也把共享库在同一个目录中的应用程序,以减少需要搜索的FS的LIB的时间。



Answer 6:

这似乎明显,我的一个选择,是几个项目静态链接全部变成一个单一的二进制。 这样,你继续分享尽可能多的代码尽可能(可能比以前更多),但你也将避免动态链接程序的开销,并保存其对系统的动态链接器在所有的空间。

这是很容易一些可执行文件合并到同一个,你通常只检查的argv和决定基于呼叫上哪个例程。



文章来源: Why is the startup of an App on linux slower when using shared libs?