-mcmodel=大型工程来自哪个版本的gcc?

-mcmodel=大型工程来自哪个版本的gcc?,gcc,Gcc,我有一个生成大于2GB的可执行文件的代码(它是生成的代码) 在带有gcc 4.3.2的x64上,我会遇到如下错误: crtstuff.c:(.text+0x20): relocation truncated to fit: R_X86_64_32S against `.dtors' 所以我知道我需要-mcmodel=large选项。然而,这并不能解决我的系统上的任何问题 我确信我在某个地方读到过,它只在特定的gcc版本中受支持,而在之前的版本中,忽略了该选项。我会告诉我的运营团队安装那个

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

在带有gcc 4.3.2的x64上,我会遇到如下错误:

crtstuff.c:(.text+0x20): relocation truncated to fit: 
  R_X86_64_32S against `.dtors'
所以我知道我需要
-mcmodel=large
选项。然而,这并不能解决我的系统上的任何问题

我确信我在某个地方读到过,它只在特定的gcc版本中受支持,而在之前的版本中,忽略了该选项。我会告诉我的运营团队安装那个版本的gcc,只要我知道它是什么。但是我现在找不到任何证据来告诉我这个假设是否正确,如果是的话,这个特性是在哪个版本中引入的

比如说

(1) 有人说这个选项没有任何作用。这本书声称涵盖了“GCC4.x”。这本书于2006年出版

(2) 有一个编译器错误报告了该选项,因此我得出结论,在该版本中,它必须至少做些什么。这似乎是gcc 4.6.1

因此,尽管我再也找不到确切的证据证明该功能是在哪个版本实现的,但至少有证据表明,随着时间的推移,这种情况已经发生了变化

我曾尝试查看所有GCC4.x版本的变更日志,但没有任何效果(通常情况下,它们都很好,因此缺少信息几乎意味着我错了,版本之间没有任何更改)


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

我相信4.4版本增加了对该功能的支持。我在下面演示了4.1在需要大数据块(而不是代码)的情况下不起作用,而4.4起作用。我不确定4.2和4.3,但您的示例和我的记忆都表明4.3对此没有工作支持。我的示例应该让您能够验证特定安装是否可以在其他易于编译的代码位上工作

作为背景,我维护了一个程序,它是一个fork-of-stream基准测试,经过专门修改,可以使用64位结构来测试更大的系统。在我开始使用“-mcmodel=large”之前,我一直被这些“重新定位截断以适应”错误所困扰,而我的fork不会编译/运行,除非它真的起作用。我发现我的程序兼容的最早的gcc版本是Debian Squence附带的4.4.5

下面是一个完整的测试用例,显示了我的fork-of-stream编译,并在没有选项的情况下,在大型模型中使用>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上,它应该抛出该错误,而不仅仅是忽略该选项


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

您还需要一个支持大型模型的glibc版本吗?尝试使用-g编译包含大量代码的大型共享库时,我在glibc ctrn.o对象中遇到了以下错误:
$ 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