c - linux上的动态链接库

标签 c linux dynamic libraries

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

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

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

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

有什么想法吗?

最佳答案

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

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

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

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

-fdata-sections -ffunction-sections

海湾合作委员会选项。对于最终的可执行文件,您将使用这两个选项加上此链接器选项:

-Wl,--gc-sections

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

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

关于c - linux上的动态链接库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16021129/

相关文章:

linux - btrfs ioctl : get file checksums from userspace

linux - 为什么我在使用 DateTime 模块时得到 "Can' t locate Sub/Identify.pm in @INC",即使我安装了 perl-DateTime RPM?

linux - 使 virtualbox 内核模块内置,而不是模块,完成一半

javascript - 如何使用 JavaScript 构建动态函数?

c - 帮助处理 C 中的字符串

c - 了解 printf 吗?

c# - TPL 任务 + 动态 == OutOfMemoryException?

C# 无法从 'out string' 转换为 'out dynamic'

c - 结构声明

c - C 中的嵌入式 Lua 从 STDIN 获取输入