You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

M1 Mac构建x86架构GCC交叉编译器时链接错误的解决方法

在M1 Mac上构建x86架构GCC交叉编译器时链接失败的解决思路

从你给出的错误信息来看,链接阶段找不到___aarch64_cas8_acq_rel这类arm64架构的符号,说明构建过程中出现了架构不匹配的问题——你要构建的是x86目标的交叉编译器,但构建环境里混入了arm64版本的依赖库或者编译模块,导致链接器试图链接arm64符号到x86目标文件中。结合你的背景信息,我整理了几个可行的解决方向:

1. 替换为x86_64架构的依赖库

你通过brew安装的gmp、mpfr、libmpc默认是arm64版本的(M1 Mac上brew默认安装到/opt/homebrew,对应arm64),这和你要构建的x86交叉编译器不兼容。你有两种方式解决:

  • 方式一:用Rosetta 2安装x86版本的依赖
    打开一个Rosetta转译的终端(右键终端应用→复制→勾选「使用Rosetta打开」),在这个终端里执行brew命令安装依赖:
    brew install gmp mpfr libmpc
    
    这些包会被安装到/usr/local(x86 brew的默认路径),之后configure时指向这个路径:
    ../gcc-11.3.0/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --disable-libssp --enable-language=c --without-headers --with-gmp="/usr/local/Cellar/gmp/6.2.1_1" --with-mpfr="/usr/local/Cellar/mpfr/4.1.0" --with-mpc="/usr/local/Cellar/libmpc/1.2.1"
    
  • 方式二:手动编译x86版本的依赖
    下载gmp、mpfr、libmpc的源码,分别编译时指定--host=x86_64-apple-darwin参数,确保输出是x86架构的库,再在configure时指向这些手动编译的路径。

2. 完善configure的架构参数

你的configure命令缺少--build--host参数,这会导致GCC的构建脚本误判当前环境的架构匹配关系,加上这些参数明确指定架构:

../gcc-11.3.0/configure \
  --build=aarch64-apple-darwin$(sw_vers -productVersion | cut -d. -f1) \
  --host=aarch64-apple-darwin$(sw_vers -productVersion | cut -d. -f1) \
  --target=$TARGET \
  --prefix="$PREFIX" \
  --disable-nls \
  --disable-libssp \
  --enable-language=c \
  --without-headers \
  --with-gmp="/path/to/x86-gmp" \
  --with-mpfr="/path/to/x86-mpfr" \
  --with-mpc="/path/to/x86-libmpc" \
  --disable-shared

其中--disable-shared参数可以避免链接到系统的动态库,减少架构冲突的概率。

3. 禁用libbacktrace模块

错误信息里的符号来自libbacktrace.a,这个模块在arm64环境下交叉编译x86时可能存在兼容性问题。你可以在configure时加上--disable-libbacktrace参数来禁用它:

../gcc-11.3.0/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --disable-libssp --enable-language=c --without-headers --with-gmp="/path/to/x86-gmp" --with-mpfr="/path/to/x86-mpfr" --with-mpc="/path/to/x86-libmpc" --disable-libbacktrace

跳过这个模块的编译后,应该能避免这些aarch64符号的问题。

4. 全程用Rosetta 2执行构建

直接在Rosetta转译的终端中完成整个下载、configure、make流程,这样整个构建环境模拟x86_64的Mac环境,从根本上减少架构不匹配的问题。执行前先确认终端是Rosetta模式,然后重新执行你的构建步骤即可。

内容的提问来源于stack exchange,提问作者Nguyen Thai Binh

火山引擎 最新活动