我接管了相当大的 C 代码。有很多遗留二进制文件需要旧版本的共享库。服务器从来没有这些确切库的版本。我可以重新编译或设置将旧版本连接到新版本的符号链接。设置符号链接需要一些时间 - 有没有标准或智能的方法来做到这一点?我对此很陌生,并会很感激任何提示。这全是 C 和 FreeBSD 环境。
谢谢。
我接管了相当大的 C 代码。有很多遗留二进制文件需要旧版本的共享库。服务器从来没有这些确切库的版本。我可以重新编译或设置将旧版本连接到新版本的符号链接。设置符号链接需要一些时间 - 有没有标准或智能的方法来做到这一点?我对此很陌生,并会很感激任何提示。这全是 C 和 FreeBSD 环境。
谢谢。
通常,在使用新库更新遗留代码时,最好通过针对新库及其包含重新编译源代码来执行检查。这将允许您使用编译器检查新旧库之间在数据类型、函数签名等方面的不一致。
通过重新编译,您还可以检查新库是否提供了您需要的所有依赖项。
最后,重新编译将帮助您检查您实际上是否能够重新编译和链接所有内容并拥有所有必要的组件。
走捷径,例如使用符号链接,我会感到不舒服。
共享库版本号仅应在 ABI 更改时更改。(旧版本的 FreeBSD 并没有完全做到这一点,它在较新的版本中得到了修复,但仅适用于系统库!)所以使这些应用程序正常工作的唯一方法是重新编译它们,或者提供确切版本的他们链接的共享库。对于仅依赖于旧版本的 FreeBSD 系统库的程序,您可以安装 compat[45678]x 软件包,它提供了随指定操作系统版本提供的库的版本——但存在重大缺陷:
1)如果您的应用程序所依赖的某些库链接到的标准库版本比您的应用程序本身更新的版本,动态链接器将为您提供两个不兼容的标准库副本,并且事情不太可能工作。
2) 如果您的应用程序使用 dlopen() 加载外部模块或插件,那么所有的赌注都没有了,因为这些模块没有版本控制。
FreeBSD 8 和更新版本对 C 库和其他一些重要的系统库使用符号版本控制,因此这些库不应再次更改库版本,并且将保留 ABI 兼容性。很多第三方开发者就不是那么小心了,既会在不改库版本的情况下破解ABI,又在不破解ABI的情况下更改库版本,这样就无法取胜。(有些开发者不阅读文档,认为共享库版本号应该与产品的版本号相同。)