“小数据部分超过64KB ..”“从输出1> collect2.exe中省略了额外的重定位溢出:错误:ld返回1退出状态”

时间:2017-08-08 11:06:55

标签: gcc compiler-errors mips

我正在使用GCC编译器。取消-mno-gpopt标志后 我在编译期间收到以下错误:

 c:/................../ld.exe: small-data section exceeds 64KB;
 lower small-data size limit (see option -G)
 .....................:(.text._ii_sem+0x56): relocation truncated to fit:**** 
 ........................
 ......................(.text._ii_+0x128): additional relocation overflows omitted from the output
 collect2.exe: error: ld returned 1 exit status
 make: *** [Makefile:76: ps100] Error 1

(参见选项-G) - MIPS文档化

  

该选项指示编译器在该数据为时将外部可见数据的定义放在小数据部分中   不大于num个字节。然后GCC可以使用gp-relative寻址,这是一个减少代码大小的强大工具   并且是工具链设计师的最爱。存储在gp寄存器范围内的数据可以在a中访问   使用gp寄存器中带符号的16位偏移量的单指令($ 28)。因为最大寻址范围是   64K字节,小数据段(.sdata,.sbss,.scommon)的总大小应小于64K字节。

什么是“小数据部分”,如何控制其大小? 哪个数据保存在小部分? 什么是-g default,即Makefile中没有提到“num”?

编辑:我曾尝试使用“-G0”,我也遇到了同样的错误。我检查过.o文件但没找到.sbss / .sdata部分。知道为什么我会得到同样的错误吗?

1 个答案:

答案 0 :(得分:1)

您可以使用" -G0"编译器选项。 " -G"选项设置小数据部分中变量的最大大小。在这种情况下,sbss / sdata / scommon中没有数据。