首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“将重定位截断为fit:针对符号R_X86_64_PC32 `__imp_Sleep‘”的问题

“将重定位截断为fit:针对符号R_X86_64_PC32 `__imp_Sleep‘”的问题
EN

Stack Overflow用户
提问于 2020-05-30 14:24:59
回答 1查看 1.7K关注 0票数 1

我编写了一个非常简单的程序,它返回这样的错误:

代码语言:javascript
运行
复制
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

以下是代码:

代码语言:javascript
运行
复制
#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),但我不知道如何修复它。对不起,我的英语和感谢帮助!

EN

回答 1

Stack Overflow用户

发布于 2021-07-16 02:03:20

gcc通常在x86-64上使用“小”或“小事先知情同意”( 代码模型 ),将代码加静态数据(即全局或static)限制为2GB。您的数组是近4GB的,所以您已经超过了这一点。您可以尝试-mcmodel=medium-mcmodel=large,但是它会对性能造成影响(对于整个程序(在large的情况下)),我不确定在MinGW上支持它是否有问题。

对于这样一个大数组,一个更好的解决方案是动态地分配它,而不是酌情使用mallocnew。它避免了这个问题,因为2GB限制只适用于静态数据。其他好处包括:

  • 如果内存不足,您的程序可以检测错误并给出有用的消息,或者返回到其他操作模式。使用静态数组,如果内存不足,程序将根本无法启动,系统的错误消息可能无法提供信息。
  • 如果在程序终止之前完成内存,就可以释放内存。
  • 在此程序中,您可以为n In分配足够的空间,如果n小于常量j,这将节省内存;如果n更大,则允许程序继续工作(就目前情况而言,您将注销数组的末端并导致未定义的行为,这可能是可利用的安全漏洞)。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62103812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档