从哪个版本的gcc -mcmodel =大型工作?

时间:2012-06-21 05:28:26

标签: gcc

我的代码生成大于2GB的可执行文件(它是生成的代码)。

在x64上使用gcc 4.3.2我收到如下错误:

crtstuff.c:(.text+0x20): relocation truncated to fit: 
  R_X86_64_32S against `.dtors'

所以我理解我需要-mcmodel=large选项。然而,这不会做任何事情或解决我的系统上的问题。

确定我在某个地方读过,它只是从特定版本的gcc支持,并且之前的版本上忽略了。如果我知道它是什么,我会告诉我的运营团队安装那个版本的gcc。但我现在无法找到任何证据来告诉我这个假设是否属实,如果是这样的话,该特征是在哪个版本中引入的。

例如

(1)Here声明该选项不做任何事情。这本书声称涵盖“GCC 4.x”。这本书出版于2006年。

(2)Here正在针对该选项报告编译器错误,因此我在该版本中得出结论,它必须至少做一些事情。这似乎是gcc 4.6.1。

因此,尽管我无法再找到确切证明该功能在哪个版本中得到实施的证据,但至少有证据表明这种情况随着时间的推移而发生了变化。

我已经尝试查看所有各种GCC 4.x版本的更改日志无效(通常它们非常好,因此缺少信息几乎意味着我错了,版本之间没有任何变化。)< / p>

编辑: This似乎暗示也许它确实有效,但我需要“重新编译crtstuff.c”,但我真的不知道我在哪里找到该文件或我是怎么做到的。

1 个答案:

答案 0 :(得分:1)

我相信4.4是增加了对此功能的支持的版本。我在下面演示4.1在4.4的情况下不起作用,在需要大数据块(而不是代码)的东西上。我不确定4.2和4.3,但你的例子和我的记忆建议4.3没有这方面的工作支持。我的示例应该让您验证特定安装是否有效,但是在一个易于编译的代码中。

作为背景,我维护了一个程序,它是流基准测试的一个分支,专门修改为使用64位结构来测试更大的系统。我被这些“重定位截断到适合”错误所困扰,直到我开始使用“-mcmodel = large”,并且我的fork不会编译/运行,除非确实有效。最古老的gcc版本我肯定发现我的程序兼容的是Debian Squeeze附带的4.4.5。

这是一个完整的测试案例,展示了我的流编译和使用&gt; 4GB RAM与大型模型,没有选项后失败:

$ gcc --version
gcc (Debian 4.4.5-8) 4.4.5
...
$ git clone https://github.com/gregs1104/stream-scaling.git
$ cd stream-scaling
$ gcc -O3 -DN=200000000 -fopenmp stream.c -o stream
/tmp/cca8rR1I.o: In function `checkSTREAMresults':
stream.c:(.text+0x34): relocation truncated to fit: R_X86_64_32S against `.bss'
...
stream.c:(.text+0x6ab): additional relocation overflows omitted from the output
collect2: ld returned 1 exit status
$ gcc -O3 -DN=200000000 -fopenmp stream.c -o stream -mcmodel=large
$ ./stream
-------------------------------------------------------------
STREAM version $Revision: 5.9 $
-------------------------------------------------------------
This system uses 8 bytes per DOUBLE PRECISION word.
-------------------------------------------------------------
Array size = 200000000, Offset = 0
Total memory required = 4577.6 MB.
...

这是在没有大型模型的gcc版本上发生的事情,一个运行RedHat 5衍生软件(CentOS 5.8):

$ gcc --version
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-52)
    ...
$ gcc -O3 -DN=200000000 -fopenmp stream.c -o stream -mcmodel=large
stream.c:1: sorry, unimplemented: code model ‘large’ not supported yet

因此,对于旧版本的gcc,它应该抛出该错误,而不是忽略该选项。

crtstuff是一个带有gcc的库。您在gcc邮件列表中链接到的错误报告来自试图为RedHat 5系统构建自己的gcc的人,正如您在最后一个示例中看到的那样,它附带了gcc 4.1。他们用大型模型重建了部分gcc,但它仍然与原始的4.1内置crtstuff库相连。如果您正在使用正确打包的gcc,那么您不应该遇到这个问题,这就是gcc开发人员认为它不是真正的错误的原因。我想你只需要gcc 4.4或更高版本。