我编写了一个非常简单的程序,它返回这样的错误:
C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib\crt2.o In function `__tmainCRTStartup':
254 C:\crossdev\src\mingw-w64-v3-git\mingw-w64-crt\crt\crtexe.c (.text+0x1fe): relocation truncated to fit: R_X86_64_PC32 against symbol `__imp_Sleep' defined in .idata$5 section in C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib/libkernel32.a(dgnms01196.o)
281 C:\crossdev\src\mingw-w64-v3-git\mingw-w64-crt\crt\crtexe.c (.text+0x286): relocation truncated to fit: R_X86_64_PC32 against symbol `__imp_SetUnhandledExceptionFilter' defined in .idata$5 section in C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib/libkernel32.a(dgnms01183.o)
289 C:\crossdev\src\mingw-w64-v3-git\mingw-w64-crt\crt\crtexe.c (.text+0x2b4): relocation truncated to fit: R_X86_64_PC32 against symbol `__mingw_winmain_hInstance' defined in COMMON section in C:/Program Files (x86)/Dev-Cpp/MinGW64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o
315 C:\crossdev\src\mingw-w64-v3-git\mingw-w64-crt\crt\crtexe.c (.text+0x313): relocation truncated to fit: R_X86_64_PC32 against symbol `__mingw_winmain_lpCmdLine' defined in COMMON section in C:/Program Files (x86)/Dev-Cpp/MinGW64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o
241 C:\crossdev\src\mingw-w64-v3-git\mingw-w64-crt\crt\crtexe.c (.text+0x495): relocation truncated to fit: R_X86_64_PC32 against symbol `__imp_GetStartupInfoA' defined in .idata$5 section in C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib/libkernel32.a(dgnms00627.o)
C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\libstdc++.a(ios_init.o) ios_init.cc:(.text$_ZNSt8ios_base4InitC2Ev+0x3c): relocation truncated to fit: R_X86_64_PC32 against symbol `__imp___iob_func' defined in .idata$5 section in C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib/libmsvcrt.a(dgrds00083.o)
C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\libstdc++.a(ios_init.o) ios_init.cc:(.text$_ZNSt8ios_base15sync_with_stdioEb+0xc0): relocation truncated to fit: R_X86_64_PC32 against symbol `__imp___iob_func' defined in .idata$5 section in C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib/libmsvcrt.a(dgrds00083.o)
C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\libstdc++.a(basic_file.o) basic_file.cc:(.text$_ZN12_GLOBAL__N_1L6xwriteEiPKcx+0xd): relocation truncated to fit: R_X86_64_PC32 against symbol `__imp__errno' defined in .idata$5 section in C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib/libmsvcrt.a(dgrds00203.o)
C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\libstdc++.a(basic_file.o) basic_file.cc:(.text$_ZNSt12__basic_fileIcE8sys_openEP6_iobufSt13_Ios_Openmode+0x1b): relocation truncated to fit: R_X86_64_PC32 against symbol `__imp__errno' defined in .idata$5 section in C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib/libmsvcrt.a(dgrds00203.o)
C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\libstdc++.a(basic_file.o) basic_file.cc:(.text$_ZNSt12__basic_fileIcE5closeEv+0x33): relocation truncated to fit: R_X86_64_PC32 against symbol `__imp__errno' defined in .idata$5 section in C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib/libmsvcrt.a(dgrds00203.o)
C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\libstdc++.a(basic_file.o) basic_file.cc:(.text$_ZNSt12__basic_fileIcE6xsgetnEPcx+0xd): additional relocation overflows omitted from the output
C:\Users\admin\Desktop\nauka\informatyka\oki\collect2.exe [Error] ld returned 1 exit status
以下是代码:
#include <bits/stdc++.h>
using namespace std;
const int j = 1e9+7;
int numbers[j];
int main(){
int n;
cin >> n;
for (int i = 0; i<n; i++){
cin >> numbers[i];
}
return 0;
}
我知道bug在第三行(因为当我将1e9改为1e8时没有bug),但我不知道如何修复它。对不起,我的英语和感谢帮助!
发布于 2021-07-16 02:03:20
gcc通常在x86-64上使用“小”或“小事先知情同意”( 代码模型 ),将代码加静态数据(即全局或static
)限制为2GB。您的数组是近4GB的,所以您已经超过了这一点。您可以尝试-mcmodel=medium
或-mcmodel=large
,但是它会对性能造成影响(对于整个程序(在large
的情况下)),我不确定在MinGW上支持它是否有问题。
对于这样一个大数组,一个更好的解决方案是动态地分配它,而不是酌情使用malloc
或new
。它避免了这个问题,因为2GB限制只适用于静态数据。其他好处包括:
n
In分配足够的空间,如果n
小于常量j
,这将节省内存;如果n
更大,则允许程序继续工作(就目前情况而言,您将注销数组的末端并导致未定义的行为,这可能是可利用的安全漏洞)。https://stackoverflow.com/questions/62103812
复制相似问题