【问题标题】:dynamic link libraries on linuxlinux上的动态链接库
【发布时间】:2013-04-07 22:02:46
【问题描述】:

我正在运行一个小型嵌入式 Linux 系统,我的应用程序使用一大堆动态链接库(*.SO 文件)。

我正在尝试节省磁盘空间,所以我想我可以将所有 .SO 文件压缩到一个压缩的 zip 文件中。

然后,当应用程序启动时,我会解压缩所有 .SO 文件,然后使用 dlopenext C 函数打开它们,然后在打开它们后将它们全部删除,因为静态库现在将在内存中?

从磁盘中删除 *SO 文件后,我还能在静态库中查找和调​​用函数吗?它现在应该在内存中吧?

有什么想法吗?

【问题讨论】:

  • 为什么不直接从压缩文件系统运行呢?例如。壁球。
  • 它已经在使用 squash,但除了磁盘空间之外,我还有其他原因需要压缩 SO 文件。我想知道打开库后,我现在可以从磁盘中删除未压缩的文件并且它仍然可以工作吗?

标签: c linux dynamic libraries


【解决方案1】:

在 Linux 上,即使您从磁盘中删除了某些内容,如果某些内容具有打开的句柄,它也不会真正被删除。它只会在句柄关闭时被删除。

所以答案是肯定的和否定的。是的,您可以删除它们并继续使用它们。不,它不会帮助您节省空间。

您可以检查 UPX (http://upx.sourceforge.net) 是否适用于您的目标平台。它可能有助于减小磁盘大小。

另一种减少代码大小的方法是静态构建。如果在您的情况下这是一个选项,那么这将允许您进行死代码剥离。您首先将每个库构建为静态存档并使用:

-fdata-sections -ffunction-sections

GCC 选项。对于您的最终可执行文件,您将使用这两个选项以及此链接器选项:

-Wl,--gc-sections

同样,这只会在构建静态库时真正有帮助。动态库不能被删除死代码(原因很明显;目前还不知道您的可执行文件正在使用库的哪些部分。)

当然,仅对您当前与可执行文件一起提供的库执行此操作。不要静态链接到系统库。

【讨论】:

    【解决方案2】:

    在大多数 *ix 实现中,文件系统上存在一个文件,直到没有更多打开的引用或指向它的链接。因此,虽然删除文件可能会使其看起来已经消失(不会出现在 ls 中),但这可能并不意味着磁盘空间已被释放。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多