将对象文件与在具有不同对齐限制的体系结构上编译的struct访问链接

时间:2014-10-24 00:02:28

标签: c struct compilation linker

我被问到以下问题而且被难倒了:

当您尝试将对象文件与结构访问链接时会发生什么情况,其中代码已针对相同的体系结构和指令集进行编译,但具有不同的对齐限制?结构定义是相同的。

我觉得代码无法链接有几个原因:

  1. 可能的对齐限制违规
  2. 一个对象文件struct access将与其他对象文件进行不同的偏移

2 个答案:

答案 0 :(得分:1)

有几种可能性:

  1. 无害的人:
    在这种情况下,不同的对齐限制是良性的,它们导致相同的最终布局。一切都很好,结局很好根据你的类型,并非不太可能。
  2. 编译器保存此类信息,并在链接时检测到不匹配 不太可能,不确定任何编译器都这样做。
  3. 可能的人。
    代码将在没有警告或错误的情况下链接,但由于程序的不同部分对类型的布局有不同的看法,因此会或多或少地出现错误。

答案 1 :(得分:1)

如果将结构保存到文件中或从文件保存,我建议会出现深刻而可爱的错误,不一定是在编译时。 (尽管编译器项目设置(虽然不容易),但是可以强制各个结构体对齐相同的对齐方式。)如果结构文件没有保存到文件中,也没有使用它们的sizeof以任何方式跨库 - 然后DLL可以在某些情况下装配在一起没有问题。但是对于文件,这是一个问题,并且会产生不良行为。