Gcc &引用;小数据段超过64KB.“&引用;输出1中省略了额外的重新定位溢出>;collect2.exe:错误:ld返回1退出状态“;

Gcc &引用;小数据段超过64KB.“&引用;输出1中省略了额外的重新定位溢出>;collect2.exe:错误:ld返回1退出状态“;,gcc,compiler-errors,mips,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:**** ..................

我正在使用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相对寻址,这是减少代码大小的强大工具 并且是工具链设计师的最爱。存储在gp寄存器范围内的数据可以在 使用gp寄存器16位有符号偏移量的单指令($28)。因为最大寻址范围是 64K字节,小数据段(.sdata、.sbss、.scommon)的总大小应小于64K字节

什么是“小数据段”,如何控制其大小? 小部分中保存了哪些数据? 什么是-g默认值,即如果Makefile中没有提到“num”

编辑:我试图使用“-G0”,但我得到了相同的错误。我已检查.o文件,但未找到.sbss/.sdata节。知道我为什么会犯同样的错误吗

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

最有可能的库(libc、libm等)是使用-G4键构建的,其全局数据位于sbss/sdata部分。你是自己编译gcc还是使用一些预构建的?