C中的共享库和二进制文件

时间:2012-08-23 16:45:50

标签: c shared-libraries freebsd

我接管了一个相当大的C代码。有许多遗留二进制文件需要旧版本的共享库。服务器从来没有那些确切库的版本。我可以重新编译或设置将旧版本连接到新版本的符号链接。设置符号链接需要一些时间 - 是否有任何标准或智能方法来执行此操作?我是新手,非常感谢任何提示。这是所有C和FreeBSD环境。

感谢。

2 个答案:

答案 0 :(得分:2)

通常,在使用新库更新遗留代码时,最好通过针对新库及其包含重新编译源代码来执行检查。这将允许您使用编译器检查数据类型,函数签名等区域中旧库和新库之间的不一致。

通过重新编译,您还可以检查新库是否提供了所需的所有依赖项。

最后,重新编译将帮助您检查您实际上是否能够重新编译和链接所有内容并拥有所有必要的组件。

如果使用符号链接,我会觉得很不舒服。

答案 1 :(得分:2)

只有在ABI更改时才会更改共享库版本号。 (FreeBSD的旧版本没有完全正确,并且它已在更新的版本中修复,但仅适用于系统库!)因此,使这些应用程序正常工作的唯一方法是重新编译它们,或提供确切版本的他们被链接的共享库。对于仅依赖于旧版FreeBSD系统库的程序,您可以安装compat [45678] x软件包,它提供随指定版本的操作系统提供的库的版本 - 但是存在重大缺陷:

1)如果您的应用程序所依赖的某些库与标准库的新版本链接而不是您的应用程序本身,则动态链接器将为您提供两个不兼容的标准库副本,并且事情不太可能正常工作

2)如果您的应用程序使用dlopen()加载外部模块或插件,则所有投注均已关闭,因为这些模块未进行版本控制。

FreeBSD 8和更新版本使用C库和其他一些重要系统库的符号版本控制,因此这些库不应再次更改库版本,并且将保留ABI兼容性。许多第三方开发人员都不是那么小心,并且会在不更改库版本的情况下破坏ABI,并在不破坏ABI的情况下更改库版本,因此您无法获胜。 (某些开发人员不会阅读文档,并认为共享库版本号应与产品的版本号相同。)