Mac M1设备Homebrew安装g++编译报addend too big for relocation错误
错误根因
该报错是M1(aarch64)架构MacOS平台上旧版GCC的已知兼容问题:
你代码中定义了全局的vector<int> vec[1145140]数组,每个vector实例在arm64架构下占24字节,总大小刚好是报错信息中出现的27483360字节。GCC 11.x版本对Darwin arm64平台的重定位逻辑存在缺陷,默认使用的小代码模型无法处理超出阈值的全局静态存储偏移,因此编译时生成的汇编指令无法完成合法重定位,触发报错。而clang针对苹果平台做了专门适配,因此可以正常编译。
解决方案
- 方案1:升级GCC版本
该BUG在GCC 12及之后的版本已经修复,你可以通过Homebrew执行brew upgrade gcc升级到最新稳定版GCC,之后使用对应版本的g++(如g++-13)编译即可正常通过。 - 方案2:添加编译参数指定大内存模型
如果你不想升级GCC版本,可以在编译时添加-mcmodel=large参数,让GCC使用支持更大偏移的大内存模型生成代码,编译命令改为:/opt/homebrew/bin/g++-11 -mcmodel=large a.cpp - 方案3:调整代码实现
从代码实践角度不建议定义超大容量的全局静态数组,你可以将其改为动态分配的形式,例如:
动态分配的内存在堆上存储,不会触发全局静态区的重定位问题。vector<vector<int>> vec(1145140);
内容的提问来源于stack exchange,提问作者zqy1018
相关产品推荐
相关产品推荐

