C linux上的动态链接库

C linux上的动态链接库,c,linux,dynamic,libraries,C,Linux,Dynamic,Libraries,我正在运行一个微型嵌入式linux系统,我的应用程序使用了一大堆动态链接的库*.SO文件 我试图节省磁盘空间,所以我想我可以把所有的.so文件压缩成一个压缩的zip文件 然后,当应用程序启动时,我会解压缩所有的.SO文件,然后使用dlopenext C函数打开它们,然后在打开它们之后,将它们全部删除,因为静态库现在将在内存中 在我从磁盘上删除*SO文件后,我还能在静态库中查找和调用函数吗?它现在应该在内存中了 有什么想法吗?在大多数*ix实现中,文件系统上存在一个文件,直到不再有指向它的打开引用

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

我试图节省磁盘空间,所以我想我可以把所有的.so文件压缩成一个压缩的zip文件

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

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


有什么想法吗?

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

在大多数*ix实现中,文件会一直存在于文件系统中,直到不再有指向它的打开的引用或链接为止。因此,虽然删除文件可能会使其看起来不见了,但不会显示在ls中,这可能并不意味着磁盘空间已被释放。

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

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

您可以检查UPX是否在目标平台上工作。这可能有助于降低磁盘大小

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

-fdata-sections -ffunction-sections GCC选项。对于最终可执行文件,您将使用这两个选项加上此链接器选项:

-Wl,--gc-sections 同样,这只有在构建静态库时才有真正的帮助。由于明显的原因,动态libs不能被死代码剥离;还不知道可执行文件正在使用库的哪些部分


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

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

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

您可以检查UPX是否在目标平台上工作。这可能有助于降低磁盘大小

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

-fdata-sections -ffunction-sections GCC选项。对于最终可执行文件,您将使用这两个选项加上此链接器选项:

-Wl,--gc-sections 同样,这只有在构建静态库时才有真正的帮助。由于明显的原因,动态libs不能被死代码剥离;还不知道可执行文件正在使用库的哪些部分


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

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