使用g ++进行编译时,重定位被截断以适应错误

时间:2011-05-20 09:05:51

标签: c++ g++ relocation

我试图在linux下编译一段cpp代码,并得到以下错误:

/tmp/ccIeh7Ta.o: In function `model::MulPLSA::EStep()':
mul_plsa.cpp:(.text+0xb12): relocation truncated to fit: R_X86_64_32S against symbol `model::MulPLSA::mItemLatRatDeno' defined in .bss section in /tmp/ccIeh7Ta.o
mul_plsa.cpp:(.text+0xb42): relocation truncated to fit: R_X86_64_32S against symbol `model::MulPLSA::mItemLatRatDeno' defined in .bss section in /tmp/ccIeh7Ta.o
/tmp/ccIeh7Ta.o: In function `model::MulPLSA::MStep()':
mul_plsa.cpp:(.text+0xcec): relocation truncated to fit: R_X86_64_32S against symbol `model::MulPLSA::mItemLatRatDeno' defined in .bss section in /tmp/ccIeh7Ta.o
collect2: ld returned 1 exit status

我的操作系统:Ubuntu 10.10
g ++:gcc版本4.4.5(Ubuntu / Linaro 4.4.4-14ubuntu5)
有人之前遇到过这个错误吗?感谢。

1 个答案:

答案 0 :(得分:1)

只是补充以上答案:

默认情况下,程序是在小代码模型中生成的,这基本上意味着它的符号必须在地址空间的低2 GB内链接。

如果它们不合适,解决方案可以是使用中型代码模型,这意味着程序和小符号链接在地址空间的低2GB中,并且大符号被放入位于2BG上方的大数据或bss部分(摘自man gcc)。 使用 -mlarge-data-threshold 定义大符号,因此可以进行一些优化,但请注意,此值应该与所有对象相同。

g++ -mcmodel=medium ....