小编Eug*_*ene的帖子

Windows下的确定性构建

最终目标是在完全相同的环境中比较从完全相同的源构建的2个二进制文件,并且能够告诉它们确实在功能上是等效的.

一个应用程序就是将QA时间集中在发布之间实际发生变化的事情上,以及一般的变更监控.

MSVC与PE格式串联自然使得这很难做到.

到目前为止,我发现并中和了这些事情:

  • PE时间戳和校验和
  • 数字签名目录条目
  • 调试器部分时间戳
  • PDB签名,年龄和文件路径
  • 资源时间戳
  • VS_VERSION_INFO资源中的所有文件/产品版本
  • 数字签名部分

我解析PE,找到所有这些东西的偏移量和大小,并在比较二进制文件时忽略字节范围.像魅力一样工作(好吧,我运行它的少数测试).我可以说,只要编译器版本和所有源和头都相同,在Win Server 2008上构建的版本1.0.2.0的已签名可执行文件等于版本10.6.6.6的无符号版本,在我的Win XP开发框上构建.这似乎适用于VC 7.1 - 9.0.(适用于发布版本)

有一点需要注意.

两个绝对路径建立 必须是相同的 ,必须具有相同的长度.

cl.exe将相对路径转换为绝对路径,并将它们与编译器标志一起放入对象中,依此类推.这对整个二进制文件具有不成比例的影响.路径中的一个字符更改将导致在此处更改一个字节,并且在整个.text部分上有几次(但是我怀疑链接了很多对象).改变路径的长度会导致明显更多的差异.在obj文件和链接二进制文件中.

感觉像带有编译标志的文件路径被用作某种哈希,这使得它成为链接二进制或甚至影响不相关的编译代码片段的放置顺序.

所以这是三部分的问题(总结为"现在是什么?"):

  • 我是否应该放弃整个项目并回家,因为我想要做的事情违反了物理法则和MS的公司政策?

  • 假设我处理绝对路径问题(在策略级别或通过查找神奇的编译器标志),还有其他我应该注意的事项吗?(之类的东西__TIME__ 意味着改变的代码,所以我不介意那些没有被忽略)

  • 有没有办法强制编译器使用相对路径,或欺骗它认为路径不是它是什么?

最后一个的原因是令人讨厌的Windows文件系统.你永远都不知道什么时候删除几个有价值的源和对象,并且svn元数据会因为流氓文件锁而失败.至少创建新根总是成功,而剩下空间.一次运行多个构建也是一个问题.运行一堆虚拟机虽然是一个解决方案,但却是一个相当繁重的虚拟机.

我想知道是否有办法为进程及其子进程设置虚拟文件系统,以便多个进程树将看到不同的 "C:\ build"目录,仅对它们是私有的,所有这些都是同时...重量级的虚拟化......

更新:我们最近在GitHub上开源了这个工具.请参阅文档中的比较部分.

c++ windows portable-executable visual-c++

28
推荐指数
2
解决办法
4651
查看次数

Xcode 5:在导航中禁用单击

因此,在与xcode 4的可怕界面选择挣扎之后,我终于在5.1.1上了.

标签变得几乎可用.双击可以配置为在新选项卡中打开文件.好.双击另一个文件会在新选项卡中打开它.好.双击第一个文件再次切换到以前打开的选项卡.好!在当前选项卡中打开时双击第一个文件将打开包含该文件的第二个选项卡.好吧,我可以忍受,因为从那里他们只是从一个切换到另一个.

到目前为止,这是一个令人惊讶的理智行

除非您错误地在导航面板中单击一下.单击打开您在当前选项卡中单击的任何内容,所有逻辑和原因都将被删除.

问题是,如何将单击行为更改为"使用单独的选项卡"(在xcode术语中)?

或者除了突出显示选择之外,禁止单击进行任何操作?

xcode xcode5.1 xcode9

13
推荐指数
1
解决办法
797
查看次数

各种版本的boost之间的boost :: interprocess :: managed_shared_memory的兼容性

是否有任何明确的兼容性保证boost :: interprocess :: managed_shared_memory可以在不同的boost版本中工作?我打算用它在多个进程之间共享一个整数或十个整数(这实际上将充当它们所有读取和写入的数据的修订号).这些过程是单独发布的,并且偶尔会终止.

问题是:我是否因为1.51中的managed_shared_memory无法与1.44中的managed_shared_memory交谈等等而将自己锁定到永久性的提升版本?

c++ boost boost-interprocess

9
推荐指数
1
解决办法
237
查看次数