在嵌入式装置我正在启动时间是一个重要的问题。整个应用程序包括几个可执行文件使用的图书馆。因为太空中的闪存是有限的,我们想到使用共用图书馆。

该应用程序职工作平时当汇编和链接公共图书馆和数量的闪存是减少预期的作用。差的版本,是联静库是启动时间的申请是关于20多岁再和我也不知道为什么。

该应用程序运行在一个ARM9CPU在180兆赫用Linux2.6.17操作系统, 16MB闪(JFFS文件系统)和32MB RAM。

有帮助吗?

解决方案

因为共用图书馆必须联系在运行时,通常通过dlopen里()或类似的东西。有没有这样的步骤对于静态的图书馆。

编辑:一些更详细的说明。dlopen里已经执行下列任务。

  • 找到的共享图书馆
  • 它加载到存储器
  • 递归载所有依赖性(及其依赖性。...)
  • 解决所有的符号

这需要相当多的IO操作要完成。

在一个静态连接的程序上述所有的是在编制时间,不能运行。因此它很快得多载一个静态连接的程序。

在你的情况下,不同的是夸大了通过将相对缓慢的硬件代码已经运行。

其他提示

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

您可以静态链接所有可执行文件,以便它们更快,但随后它们将占用更多空间

您可以拥有占用更少空间但也有更多时间加载的共享库。

所以决定你要牺牲什么。

这种差异有许多因素(操作系统,编译器等),但可以找到一系列理由这里。基本上共享库是出于空间原因而创建的,并且大部分是“魔术”。使他们工作所涉及的性能受到了打击。

(作为历史记录,Linux / Unix上的原始Netscape导航器是静态链接的大型可执行文件)。

这可能有助于其他有类似问题的人:

在我的情况下启动花了这么长时间的原因是,GCC的默认设置是导出库中的所有符号。 一个很大的改进是设置编译器设置“-fvisibility = hidden”。

必须使用语句

扩充lib必须导出的所有符号

__ attribute __((visibility(" default"))))

请参阅 gcc wiki
和非常好的文章如何编写共享库

好的,我现在已经了解到共享库的使用对速度有不利影响。我发现这篇文章关于动态链接和加载的启发。装载过程似乎比我预期的要长得多。

有趣的..通常,共享库的加载时间与静态链接的胖应用程序无法察觉。所以我只能猜测系统要么从闪存加载库要么很慢,要么以某种方式检查加载的库(例如.NET应用程序为所有加载的dll运行校验和,大大减少启动时间)一些案例)。可能是根据需要加载共享库,然后卸载,这可能表示配置问题。

所以,抱歉,我不禁说出原因,但我认为这是您的ARM设备/操作系统的问题。您是否尝试过检测启动代码,或者静态链接1个最常用的库,看看是否会产生很大的差异。还将共享库放在与应用程序相同的目录中,以减少搜索FS的库所需的时间。

对我来说,一个显而易见的选择是将几个程序静态链接到一个二进制文件中。这样你就可以继续共享尽可能多的代码(可能比之前更多),但是你也可以避免动态链接器的开销,并节省在系统上拥有动态链接器的空间。

将几个可执行文件组合到同一个可执行文件中非常容易,通常只需检查argv并根据该文件决定调用哪个例程。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top