You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows下Mingw-w64编译gnu-efi遇ctors.S错误求解决

解决Windows下MinGW-w64编译gnu-efi时ctors.S的汇编错误

问题背景

Windows 11环境,基于GCC 13.1.0(POSIX线程)+LLVM 16.0.5+MinGW-w64 11.0.0(UCRT)编译gnu-efi,多数文件可正常编译,但ctors.S出现行尾逗号相关错误:

C:/Users/[my username]/gnu-efi/lib/ctors.S:11: Error: junk at end of line, first unrecognized character is `,'
C:/Users/[my username]/gnu-efi/lib/ctors.S:18: Error: junk at end of line, first unrecognized character is `,'
C:/Users/[my username]/gnu-efi/lib/ctors.S:25: Error: junk at end of line, first unrecognized character is `,'
C:/Users/[my username]/gnu-efi/lib/ctors.S:32: Error: junk at end of line, first unrecognized character is `,'

Linux原生GCC编译正常,但Windows/Linux下的MinGW-w64编译均失败,目前临时改用Linux,需Windows下的可行解决方案。

核心原因

gnu-efi的ctors.S使用了ELF格式特有的汇编段定义语法(如.section .ctors,"aw",@progbits),而MinGW-w64默认生成COFF格式目标文件,其配套的GAS汇编器对ELF风格的段属性逗号分隔语法不兼容,将逗号识别为无效字符。

可行解决方案

1. 修改ctors.S的段定义语法

打开gnu-efi/lib/ctors.S,找到所有类似以下的行:

.section .ctors,"aw",@progbits

去掉ELF特有的@progbits标记,修改为COFF兼容的写法:

.section .ctors,"aw"

保存后重新编译,MinGW的GAS即可正确解析段定义。

2. 用LLVM汇编器替代GAS

你已安装LLVM 16,llvm-as对ELF/COFF语法兼容性更好,可通过两种方式切换:

  • 临时方案:在msys2终端执行以下命令后再运行make:
    export AS=llvm-as
    
  • 永久修改:找到Makefile中编译汇编文件的规则,将$(AS)替换为llvm-as,例如:
    %.o: %.S
    	llvm-as -o $@ $<
    

3. 强制汇编器生成ELF格式目标文件

MinGW-w64的GAS支持生成ELF格式,通过添加-melf_x86_64选项强制按ELF语法处理:

  • 修改Makefile中的ASFLAGS,添加该选项:
    ASFLAGS += -melf_x86_64
    
    这样汇编器会识别ELF风格的段定义语法,避免逗号错误。

4. 使用适配MinGW的gnu-efi分支

部分社区维护的gnu-efi fork已修复MinGW编译问题,可直接克隆这类分支编译(无需自行修改代码)。

内容的提问来源于stack exchange,提问作者ProgrammerJ1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 05:23:02