我提前为这个冗长的问题道歉,但我想确保我没有遗漏任何可能改变你回复的关键点。
我负责维护用'C'编写的系统软件,我们有一些常见的'.a'库。我们称之为“执行管理器”,其主要工作是分叉并执行“test-job”可执行文件的变量列表,并在测试作业进程终止后将控制权返回给执行管理器。所有可执行文件(包括执行管理器)都与上述库静态链接。执行管理器和测试作业处理它通过共享内存使用IPC。其中一个公共库包含包装函数,用于创建和附加永远不会更改的预定义键的共享内存。
几个月前,我们锁定了我们的软件(测试作业和执行管理器),静态编译并发布它们以使测试作业“得到证明”。从那时起,已经有一些请求要求对执行管理器进行更改,这需要更改选定的几个公共库函数。但是,管理层已经决定他们不想针对新版本的公共库重新编译测试作业,因为这将要求他们重新证明他们当前拥有的测试作业可执行文件;他们不想花钱去做那件事。
由于所有可执行文件都是静态编译的,我通常会说执行管理器与针对同一公共库的不同版本静态编译的测试作业混合不会成为问题。然而,通过共享内存包含IPC让我想知道是否仍然如此。我的直觉是,只要共享内存包装函数没有变化,特别是密钥,那么我们应该没问题,但我真的可以对此使用一些专家意见。
感谢您花时间阅读本文,非常感谢。
答案 0 :(得分:2)
您应该没问题,只要定义进程如何通过共享内存相互通信的数据结构和协议没有改变。 (也就是说,两个进程之间存在的小ABI。)
答案 1 :(得分:1)
我想确认caf说的是什么。您已正确识别关键位:用于访问共享内存的密钥和包装函数。这些位不关心它们是否在.o文件中定义,它们是.a文件的一部分,还是在.a文件中。在链接时,它们被拉入exe,保持其原始功能;它们在.a文件中的“临时主页”不会影响它们如何找到共享内存段,它们如何确定相关的偏移量等等。因此,如果这些(即密钥和包装函数)没有改变,那么你应该设置。