修改OBJ文件链接到的源文件会破坏应用程序吗

Modifying Source File Linked to by OBJ Files Crashes Application?

本文关键字:应用程序 源文件 OBJ 文件 链接 修改      更新时间:2023-10-16

我正在处理一个项目,其中有可以编辑的源文件(.cpp,.h)和不能编辑的对象文件(.obj)。我正在尝试将变量添加到源文件的一个类中。它编译和链接很好,但它会在应用程序生命周期的某个地方导致随机崩溃。

我的问题是:有没有任何方法可以将成员变量添加到位于OBJ文件链接和使用的源文件中的类中(而无需重新编译OBJ文件)

我知道我完全有可能误解了实际问题是什么,但这是我以前遇到过的最好的猜测,我希望能回答我的问题。当然,除非你绝对确定我的问题是别的。

这里有一些背景:我正在使用另一个程序员的代码。他们设置了多个在代码库中随处使用的singleton。我正试图使用消息将一组特定的系统与所有单体解耦,以便更容易地管理、修改和构建系统。在向其中一个singleton添加变量后,它每次都会在同一个地方崩溃应用程序(我看不到的源代码)。根据我添加的变量类型,崩溃将发生在应用程序中的某个不同点。我已经考虑过代码库中的某个地方存在缓冲区溢出,但我没有时间处理这个问题,我正在首先研究其他更具体的可能原因。

当然,"简单"的解决方案是让分发OBJ文件的程序员在添加了我的新变量的情况下重新编译它们(他们以前不得不这样做过一次),但我仍在研究将系统解耦的最佳方法,而且由于另一位程序员的工作计划与我的相反,因此执行和撤消这一操作的转变将过于耗时。

如果它们是相关的,我会发布一些源代码或调试调用堆栈,但它们不是。这个问题完全如所述。我给一个类添加了一个变量。它现在在一些随机OBJ文件的例程中崩溃程序。

谢谢你抽出时间。

如果我正确阅读了您的问题(您在最终可执行文件中有两个不同版本的相同类型),您所要求的内容将导致运行时出现未定义的行为。

假设您有一个名为"foo"的结构,它有两个int成员,并由您的程序员同事编译到一个单独的对象文件中。然后取"foo",向其添加一个int成员,然后将其编译为另一个obj文件。现在,您可以链接创建可执行文件的两个obj文件。

您有两个问题——在程序运行期间(foo)的大小是多少?它等于foo的较小版本还是较大版本?其次,链接器很可能为较小版本保留了空间——当程序试图访问您添加到较大版本的foo中的int时会发生什么?将发生内存"重写"或重写。

你应该与你的程序员同事协调你的工作。您是否使用源版本控制系统?如果是这样的话,这通常就是解决这些问题的地方。