修改由OBJ文件链接的源文件崩溃应用程序?

时间:2013-12-31 00:40:39

标签: c++ visual-studio-2012 linker crash precompiled

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

我的问题是:有没有办法可以将成员变量添加到一个类中,该类驻留在一个链接到OBJ文件并由OBJ文件使用的源文件中(不重新编译OBJ文件)?

我明白,我完全有可能误解了实际问题是什么,但这是我最好的猜测,因为我之前遇到过它,并会很感激回答我的问题。当然,除非你完全确定我的问题是别的。

这是一些背景知识:我正在使用另一个程序员的代码。他们设置了代码库中无处不在的多个单例。我试图使用消息将一组特定的系统与所有单例分离,以便我可以更轻松地管理,修改和构建系统。将变量添加到其中一个单例后,每次都会在同一个地方崩溃应用程序(其中我看不到源代码)。根据我添加的变量类型,该崩溃将发生在应用程序的某个不同点。我认为代码库中某处存在缓冲区溢出,但我没有时间处理该问题,并且首先考虑其他更具体的可能原因。

当然,“简单”的解决方案是让正在抛出OBJ文件的程序员用我添加的新变量重新编译它们(他们以前必须做的一次),但我仍然在努力做到最好由于另一个程序员的工作时间与我的工作时间相反,因此解耦系统的方式以及执行和撤消的周转时间太长了。

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

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

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

假设你有一个名为“foo”的结构,它有两个int成员,并由你的程序员编译成一个单独的目标文件。然后你拿“foo”,添加一个int成员,然后将它编译成另一个obj文件。您现在链接创建可执行文件的两个obj文件。

你有两个问题 - 在程序运行期间sizeof(foo)是什么?它等于较小版本或更大版本的foo吗?其次,链接器很可能为较小的版本保留空间 - 当程序试图访问你添加到更大版本的foo的int时会发生什么?将发生内存“重读”或覆盖。

您应该与其他程序员协调您的工作。您是否使用源修订控制系统?如果是这样,通常会解决这些问题。