" relocation truncated to fit: R_X86_64_PC32 against symbol `__imp_Sleep' "问题

Problem with " relocation truncated to fit: R_X86_64_PC32 against symbol `__imp_Sleep' "

本文关键字:symbol imp Sleep 问题 against to truncated relocation fit X86 PC32      更新时间:2023-10-16

我写了一个非常简单的程序,它返回如下错误:

C:Program Files (x86)Dev-CppMinGW64x86_64-w64-mingw32libcrt2.o    In function `__tmainCRTStartup':
254     C:crossdevsrcmingw-w64-v3-gitmingw-w64-crtcrtcrtexe.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-CppMinGW64x86_64-w64-mingw32lib/libkernel32.a(dgnms01196.o)
281     C:crossdevsrcmingw-w64-v3-gitmingw-w64-crtcrtcrtexe.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-CppMinGW64x86_64-w64-mingw32lib/libkernel32.a(dgnms01183.o)
289     C:crossdevsrcmingw-w64-v3-gitmingw-w64-crtcrtcrtexe.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:crossdevsrcmingw-w64-v3-gitmingw-w64-crtcrtcrtexe.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:crossdevsrcmingw-w64-v3-gitmingw-w64-crtcrtcrtexe.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-CppMinGW64x86_64-w64-mingw32lib/libkernel32.a(dgnms00627.o)
C:Program Files (x86)Dev-CppMinGW64libgccx86_64-w64-mingw324.9.2libstdc++.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-CppMinGW64x86_64-w64-mingw32lib/libmsvcrt.a(dgrds00083.o)
C:Program Files (x86)Dev-CppMinGW64libgccx86_64-w64-mingw324.9.2libstdc++.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-CppMinGW64x86_64-w64-mingw32lib/libmsvcrt.a(dgrds00083.o)
C:Program Files (x86)Dev-CppMinGW64libgccx86_64-w64-mingw324.9.2libstdc++.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-CppMinGW64x86_64-w64-mingw32lib/libmsvcrt.a(dgrds00203.o)
C:Program Files (x86)Dev-CppMinGW64libgccx86_64-w64-mingw324.9.2libstdc++.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-CppMinGW64x86_64-w64-mingw32lib/libmsvcrt.a(dgrds00203.o)
C:Program Files (x86)Dev-CppMinGW64libgccx86_64-w64-mingw324.9.2libstdc++.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-CppMinGW64x86_64-w64-mingw32lib/libmsvcrt.a(dgrds00203.o)
C:Program Files (x86)Dev-CppMinGW64libgccx86_64-w64-mingw324.9.2libstdc++.a(basic_file.o)   basic_file.cc:(.text$_ZNSt12__basic_fileIcE6xsgetnEPcx+0xd): additional relocation overflows omitted from the output
C:UsersadminDesktopnaukainformatykaokicollect2.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;
}

我知道错误在第三行(这个大数字是因为当我将 1e9 更改为 1e8 时没有错误(,但我不知道如何修复它。对不起我的英语,谢谢你的帮助!

gcc 通常在 x86-64 上使用"small"或"small pic"代码模型,它将代码加静态数据(即全局或static(限制为 2 GB。 您的阵列接近 4 GB,因此您超过了这个数字。 您可以尝试-mcmodel=medium-mcmodel=large,但它会降低性能(在large的情况下,对于您的整个程序(,我不确定在 MinGW 上支持它是否存在问题。

对于如此大的数组,更好的解决方案是动态分配它,而不是根据需要使用mallocnew。 它避免了此问题,因为 2 GB 限制仅适用于静态数据。 其他好处包括:

  • 如果可用内存不足,程序可以检测到错误并提供有用的消息或回退到其他操作模式。 对于静态数组,如果没有足够的内存,程序将根本无法启动,并且系统的错误消息可能无法提供信息。

  • 如果在程序终止之前完成内存,则可以释放内存。

  • 在这个程序中,你可以为n个整数分配足够的空间,如果n小于你的常量j,这将节省内存,如果n更大,程序仍然可以工作(就目前而言,你会注销数组的末尾并导致未定义的行为, 可能是可利用的安全漏洞(。

相关文章: