作为链接时的正常步骤,链接器会测试压缩 RW 初始化数据是否会节省一些代码空间。如果确实如此,则从 Arm 运行时库中提取解压缩例程。在某些特殊情况下,可能会发生这种情况,链接器稍后会更改此决定并且不会压缩该 RW 初始化数据。相反,这些数据应该由库启动代码复制,但是由于之前没有拉入copy函数,所以链接器会报这个错误。
此行为是链接器中的问题,对此的触发器可以是具有大对齐要求的数据对象。
有两种可能的解决方法:
使用链接器选项 --undefined:
--undefined=__scatterload_copy
这将手动创建对 Arm 运行时库的复制函数的引用,因此,无论链接器决定压缩还是复制 RW 初始化数据,它都会被拉入。
使用链接器选项 --datacompressor:
--datacompressor=off
这将导致链接器不尝试压缩 RW 初始化数据,将复制所有 RW 初始化数据,复制功能将被正确拉入。