【问题标题】:Problem with " relocation truncated to fit: R_X86_64_PC32 against symbol `__imp_Sleep' "“relocation truncated to fit: R_X86_64_PC32 against symbol `__imp_Sleep'”的问题
【发布时间】:2020-09-18 01:50:49
【问题描述】:

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

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;
}

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

【问题讨论】:

标签: c++ c dev-c++ truncated


【解决方案1】:

gcc 通常在 x86-64 上使用“small”或“small PIC”code model,这将代码加上静态数据(即全局或static)限制为 2 GB。您的阵列接近 4 GB,因此您已经超过了。你可以试试-mcmodel=medium-mcmodel=large,但它有性能损失(在large 的情况下你的整个程序),我不确定在MinGW 上支持它是否存在问题。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 2014-05-06
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多