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