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,添加该选项:
这样汇编器会识别ELF风格的段定义语法,避免逗号错误。ASFLAGS += -melf_x86_64
4. 使用适配MinGW的gnu-efi分支
部分社区维护的gnu-efi fork已修复MinGW编译问题,可直接克隆这类分支编译(无需自行修改代码)。
内容的提问来源于stack exchange,提问作者ProgrammerJ1
相关产品推荐
相关产品推荐

