我如何知道可执行文件是不是被增量链接?

Posted

技术标签:

【中文标题】我如何知道可执行文件是不是被增量链接?【英文标题】:How can I know if an executable was incrementally linked or not?我如何知道可执行文件是否被增量链接? 【发布时间】:2009-07-07 16:05:06 【问题描述】:

我正在尝试使用 Purify 6 分析我们使用 VC++ 2003 (7.1) 构建的一个可执行文件中的内存损坏。

当我使用命令检测二进制文件时:

purify /Replace=yes /Run=no myprog.exe

检测中止告诉我可执行文件是增量链接的。很困惑,我检查了构建选项,但 /INCREMENTAL:NO 在那里。可以肯定的是,我重建了它,并且在链接时正确传递了选项。

有没有办法知道可执行文件是否被增量链接?

我查看了dumpbin /HEADERS 所说的内容,但没有看到任何相关内容。

谢谢。

【问题讨论】:

我认为增量链接的可执行文件可能比平常更大。 他们当然可以,但知道这对我没有帮助。 您是在尝试调试还是发布 exe?因为“指定 /DEBUG 时隐含 /INCREMENTAL”(msdn.microsoft.com/en-us/library/4khtbfyf.aspx)。 如果我理解正确,如果没有找到.ilk 文件,LINK 将不会使用增量链接。然后它仍然会创建一个新的.ilk 文件,但是根据msdn.microsoft.com/en-us/library/4khtbfyf(VS.80).aspx 那是“为后续增量链接做准备”,所以不用于当前链接?那么,如何删除所有.ilk 文件并查看是否有任何变化?您是否检查了其他推荐的设置?以下是 PurifyPlus 的一些内容:ibm.com/support/docview.wss?rs=995&uid=swg21265414 -- 顺便说一下,它使用 both /DEBUG 和 /INCREMENTAL:NO。 @Kcats:这是一个调试版本,带有 /INCREMENTAL:NO。 @Arjan:我会试试的,谢谢。 【参考方案1】:

选项 1:

c:...>dumpbin /summarywhatever.exe

查找“.textbss”部分。

我不确定这是否 100% 可靠,但根据我的经验,链接器在进行增量链接时总是会添加此部分。

选项 2:

在可执行文件旁边查找“.ilk”文件。 Visual Studio 似乎很擅长在不使用它们时清理它们,因此禁用增量链接和构建(甚至不是“重建”)应该将其删除。

选项 3:

启用构建日志记录(工具/选项/项目)并在它生成的 buildlog.html 文件中查找“/INCREMENTAL”或“/INCREMENTAL:NO”。

选项 4:

解析 .vcproj 文件。 (恶心!)

【讨论】:

至于选项 2 中的清理:您可能是对的,但我评论中的 MSDN 链接似乎另有说明。 (我猜选项 3 实际上是通过验证构建命令在问题本身中提到的。) 感谢您的意见。我马上去检查第 1 点。其他点有点偏离,因为我控制着构建过程(这里没有 .vcproj),我只需要一种方法来确保交付的二进制文件不会被错误地增量链接。构建过程无论如何都不会安装 .ilk 文件。 如果您在某个地方交付二进制文件,最好的方法是从干净的结帐中构建它们(在具有受控环境的专用构建机器上)。这将消除这个问题和许多其他潜在问题。 寻找 .txtbss 部分似乎是我问题的正确答案。 en.wikibooks.org/wiki/X86_Disassembly/…

以上是关于我如何知道可执行文件是不是被增量链接?的主要内容,如果未能解决你的问题,请参考以下文章

SQLite 库可以嵌入(链接)到 Delphi 可执行文件吗?

Linux动态和静态链接

当我使用的库使用的库发生更改时,我的可执行文件是不是需要重新链接?

如何在 C 编程中将两个头文件和 3 个 c 文件链接到一个可执行文件中?

linux下如何运行可执行文件

如何使您的可执行文件可信