LNK2013错误"fixup overflow"

LNK2013 error "fixup overflow"

本文关键字:overflow fixup LNK2013 错误      更新时间:2023-10-16

我有一个用c++编写的Windows 8 metro应用程序,我正试图将其编译到ARM。在链接过程中,我得到了以下错误的许多实例:

"error LNK2013: BLX23(T) fixup overflow.  Target '<mangledName>' is out of range"

MSDN网站上写道:"你可以通过创建多个图像或使用/ORDER选项来解决这个问题,这样指令和目标就更接近了。"

但我真的不知道如何做到这一点。有问题的符号是编译器生成的,不涉及安腾体系结构,因此该页上的其他建议不适用。此外,出现错误的文件是*.g.cpp文件,由编译器从项目中包含的xaml页面生成。

metro应用程序在Win32配置上运行得很好,所以我想知道在ARM上更有经验的人是否能更好地了解如何解决这类问题。

安装程序是Windows 8 RP x64上的Visual Studio 2012 RC。

这是由于ARM上增量链接中的一个不幸错误造成的,可以通过禁用增量链接来解决。正如另一个答案中所提到的,这是因为被调用的函数和调用站点相距甚远,以至于链接器需要插入长分支岛(在使用增量链接时,创建长分支岛有一个非常特殊的错误)。

据我所知,这个错误并没有为RTM修复(当我自己发现这个问题时,已经太晚了,无法为RTM版本修复),但它是已知的,并计划在未来的版本中修复。

关键问题是ARM指令集只支持编译器试图用于生成函数调用的指令的相对位移,并且这些位移中的位数有限。在您的情况下,您有太多的代码,以至于被调用函数和调用站点在地址空间中相距太远,以至于在位移中没有足够的位供编译器生成正确的调用指令。

这可能发生在ARM和IA64(安腾)上,但在x86和x86-64中不可能发生,因为这些指令集具有跳转/调用指令,可以分支到进程地址空间中的任何可能地址。

唯一的解决方法是在最终的可执行映像中将调用者和被调用者移得更近。这样做的一种方法是只在源文件中移动代码,因为通常编译器和链接器将函数代码按照在源文件(在一个翻译单元内)中声明函数的相同顺序放置到可执行文件中。优化通常会改变这种顺序,但在大多数情况下,这几乎是真的。

您提供的链接中提到的另一个选项是使用链接器的/ORDER命令行选项手动移动函数。创建一个订单文件,并将出现此问题的函数放在一起,假设它们不太多。因为这听起来像是在处理自动生成的代码,所以这可能是最好的选择,因为你不想每次重新生成代码时都要编辑它。

您可能还想在connect.microsoft.com上发布一份错误报告,因为默认工具集确实不应该强迫您处理这个相当奇怪的错误(由于ARM指令集的限制,这是一个非常真实的错误——这不是编译器的错)。