如何在Linux上的项目中的一个共享库(.so)中修复?

fac*_*cha 5 linux upgrade shared-libraries recompile

我想快速修复一个项目的.so库.重新编译.so并替换原始文件是否安全?或者我必须重建并重新安装整个项目?还是取决于?

Ale*_*x B 4

这取决于。共享库需要与您的可执行文件二进制兼容

例如,

  1. 如果您更改了库内部函数之一的行为,则可能不需要重新编译。
  2. 如果您更改了应用程序已知的结构的大小(例如通过添加成员),则需要重新编译,否则库和应用程序会认为该结构比实际小,并且当库尝试时会崩溃读取应用程序未写入的额外未初始化成员。
  3. 如果您更改应用程序中可见的任何函数的类型或参数位置,则确实需要重新编译,因为库将尝试从堆栈中读取比应用程序放入其中的参数更多的参数(C 就是这种情况) ,在C++中参数类型是函数签名的一部分,因此应用程序将拒绝运行,而不是崩溃)。

经验法则(对于生产版本)是,如果您没有意识到自己正在维护二进制兼容性,或者不确定什么是二进制兼容性,则应该重新编译。