我正在运行一个小型嵌入式Linux系统,我的应用程序使用了一大堆动态链接库(* .SO文件)。
我正在尝试节省磁盘空间,所以我想我可以将所有.SO文件压缩成一个压缩的zip文件。
然后,当应用程序启动时,我将解压缩所有.SO文件,然后使用dlopenext C函数打开它们,然后在打开它们之后将它们全部删除,因为静态库现在将在内存中?
从磁盘上删除* SO文件后,我是否仍然可以在静态库中查找并调用函数,它现在应该在内存中了吗?
有什么想法吗?
答案 0 :(得分:3)
在Linux上,即使您从磁盘中删除了某些内容,如果某些东西有一个打开的句柄,它也不会被删除。它只会在句柄关闭时被删除。
所以答案是肯定和否定。是的,您可以删除它们并继续使用它们。不,它无助于您节省空间。
您可以检查UPX(http://upx.sourceforge.net)是否适用于您的目标平台。它可能有助于降低磁盘大小。
减少代码大小的另一种方法是静态构建。如果这是您的选项,那么这将允许您执行死代码剥离。您首先要将每个库构建为静态存档,并使用:
-fdata-sections -ffunction-sections
GCC选项。对于最终的可执行文件,您将使用这两个选项以及此链接器选项:
-Wl,--gc-sections
同样,这只会在构建静态库时提供帮助。动态库不能被删除死代码(出于显而易见的原因;还不知道您的可执行文件正在使用的库的哪些部分。)
当然,仅对当前随附可执行文件的库执行此操作。不要静态链接系统库。
答案 1 :(得分:1)
在大多数* ix实现中,文件系统上存在一个文件,直到没有更多的开放引用或链接。因此,虽然删除文件可能会使其显示已消失(未显示在ls
中),这可能并不意味着磁盘空间已被释放。