我提前为这个冗长的问题道歉,但我想确保我没有遗漏任何可能会改变您的回答的关键点。
我负责维护用“C”语言编写的系统软件,我们有一些常用的“.a”库。我们有一个我称之为“执行管理器”的东西,它的主要工作是 fork 和执行“测试作业”可执行文件的变量列表,并在测试作业进程终止后将控制权返回给执行管理器。所有可执行文件,包括执行管理器,都静态链接到上述库。执行管理器和它派生的测试作业进程通过共享内存使用 IPC。其中一个公共(public)库包含包装函数,用于创建共享内存并使用永不更改的预定义 key 附加共享内存。
几个月前,我们锁定了我们的软件(测试作业加执行管理器),静态编译它们并发布它们以对测试作业进行“验证”。从那时起,有一些要求对执行管理器进行更改的请求,这将需要更改选定的几个公共(public)库函数。但是,管理层已决定他们不想针对新版本的公共(public)库重新编译测试作业,因为这将要求他们重新验证当前拥有的测试作业可执行文件;他们不想为此花钱。
由于所有可执行文件都是静态编译的,我通常会说将执行管理器与针对同一公共(public)库的不同版本静态编译的测试作业混合使用不会有问题。但是,通过共享内存包含 IPC 让我想知道这是否仍然正确。我的直觉告诉我,只要共享内存包装函数没有变化,尤其是键,那么我们应该没问题,但我真的可以就此征求一些专家意见。
感谢您花时间阅读本文,非常感谢。
最佳答案
您应该没问题,只要定义进程如何通过共享内存相互通信的数据结构和协议(protocol)没有改变。 (也就是说,您的小 ABI 存在于两个进程之间)。
关于c - 混合 exe 静态编译的不同版本的库 w/共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2098713/