与"ld: 32-bit RIP relative reference out of range" on Mac OSX相关但未解决且在更复杂的背景下。相关的计算机有> 32GB的RAM。
static const int K=1024;
static const int M=K*K;
static const int G=K*M;
const int MC = G;
void donada(float *rvec, const int MC) { rvec[MC-1]= 1.0; return; }
float notused[1][MC]; // 4GB, ramp up with first index
float used[MC]; // 4GB
int main() {
donada( used, MC );
donada( notused[1], MC );
}
和gcc -Wall -o test test.cc
。编译此程序而不是osx yield
在Linux上,有一个类似的错误ld:32位RIP相对参考超出范围(最大值为4294967395) +/- 2GB):从_main(0x100000F92)到_used(0x200001000),来自/ var / folders / yl / 8gp3pgbn1l562ywg_q86rk6800 \ 00z9 / T / test-b3bebf.o 对于架构x86_64
test.cc :(。text + 0x18):重定位被截断以适合:R_X86_64_32与/tmp/ccqcNh2C.o中.bss部分中定义的符号`used'
我首先想到编译器标志-Os
会解决这个问题,但事实并非如此。 gcc或clang适合提供更具暗示性的错误消息。
答案 0 :(得分:2)
相关计算机具有> 32GB的RAM。
这实际上并不是很相关。问题是64位GCC默认为-mcmodel=small
,并且您尝试访问4GiB远离其基本符号的数据,这与小型号无法匹配。
-mcmodel=small
Generate code for the small code model: the program and its symbols
must be linked in the lower 2 GB of the address space. Pointers are 64 bits.
Programs can be statically or dynamically linked. This is the default code model.
-mcmodel=medium
Generate code for the medium model: The program is linked in the lower 2 GB
of the address space. Small symbols are also placed there.
Symbols with sizes larger than -mlarge-data-threshold are put into large data
or bss sections and can be located above 2GB.
Programs can be statically or dynamically linked.
-mcmodel=large
Generate code for the large model: This model makes no assumptions about addresses
and sizes of sections.
要正确关联您的计划,您需要使用-mcmodel=large
。
但是请注意,这没有经过充分测试(几乎没有人这样做),而且(静态)链接到程序中的所有代码都需要以这种方式构建。
相反,动态分配数组可能要好得多。
我首先想到编译器标志
-Os
会解决这个问题
它不能:-Os
最小化代码大小。您的程序是强制编译器分配非常大的连续数据数组。编译器无法针对其大小进行优化。