我正在尝试弄清楚在发行版中静态二进制文件优先于共享二进制文件的含义。为此,我整理了一个小Scala shell 脚本1) 遍历/bin
、/sbin
、/usr/bin
、/usr/sbin
目录,2) 定位非符号链接可执行文件,3) 计算 列出的库的文件大小ldd
。这是一种计算所需额外空间的可行方法吗?
此外,除了额外的磁盘空间消耗之外,运行时内存使用方面还有哪些影响?也就是说,针对同一共享库编译的二进制文件将允许内核在运行时仅实例化一次共享库。对于静态二进制文件,每个二进制文件都需要为同一个库保留额外的内存。如果有足够的交换空间,这仍然会是个问题吗?(毕竟,大多数用户空间 Windows 应用程序不都是这样运行的吗?)还有其他我可能遗漏的潜在影响吗?
答案1
静态库和共享库之间的主要区别在于,使用静态库时,每个程序都有其所用库部分的副本。使用共享库时,代码将单独存储。
Windows 和 Linux 一样,使用静态链接库和共享库的混合。在 Windows 中,dll 文件是 Linux 中的共享库,这些库的扩展名通常为 .so
使用静态库编写的程序更大,占用更多磁盘空间。此外,如果两个或多个正在运行的程序使用相同的库函数,那么此代码将在 RAM 中多次出现。根据调用函数的复杂性,这可能意味着使用更多 RAM,因此可能需要更频繁地交换空间。调用共享库会产生开销,因此如果函数足够简单,那么使用静态库在 RAM 方面可能更有效率。
如果在共享库中发现错误,则只需更新共享库。如果在静态库中发现相同的错误,则需要重新编译和更新使用它的所有程序。另一方面,如果使用静态库链接程序,则无需担心库是否可用,以及它是否是正确的版本。
这两种方法各有优缺点。
这里有更多信息
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html