启用multilib及多语言支持编译GCC-15.1.0失败求助
GCC-15.1.0编译Go组件时_SYS_futex和_SYS_timer_settime未定义问题解决
问题概述
编译启用multilib且支持C、C++、D、Fortran、Go、COBOL、Modula-2的GCC-15.1.0源码时,Go语言运行时编译环节报错,系统无法识别_SYS_futex和_SYS_timer_settime常量。使用make -j$( ( nproc + 1 ))命令编译,预期ARM、AArch64、RISCV64交叉编译选项失败时主构建仍能完成,但实际因上述错误中断。
具体错误信息
../../.././libgo/go/runtime/os_linux.go:36:30: error: reference to undefined name "_SYS_futex" return int32(syscall(_SYS_futex, uintptr(addr), uintptr(op), uintptr(val), uintptr(ts) uintptr(addr2), uintptr(val3))) return int32(syscall(_SYS_timer_settime, uintptr(timerid), uintptr(flags), uintptr(unsafe.Pointer(new)), uintptr(unsafe.Pointer(old)), 0, 0))
解决步骤
- 检查系统头文件:查看
/usr/include/bits/syscall.h或/usr/include/linux/syscalls.h,确认是否存在_SYS_futex和_SYS_timer_settime定义。若缺失,更新glibc-devel包以获取完整的系统调用常量定义。 - 修正configure配置:编译GCC时添加
--build=x86_64-linux-gnu明确主机架构,避免交叉编译逻辑干扰主构建;若不需要交叉编译ARM/AArch64/RISCV64,直接移除这些目标的配置,优先完成主架构编译。 - 手动传入常量定义:在编译libgo阶段,为gccgo添加编译选项手动指定常量值,例如:
注:上述数值为x86_64架构下的典型系统调用号,需根据实际系统调整。make CFLAGS_FOR_TARGET="-D_SYS_futex=202 -D_SYS_timer_settime=223" - 修复libgo源码:修改
libgo/go/runtime/os_linux.go,将未定义的常量替换为对应系统调用号,或添加正确的头文件引入逻辑,确保能自动获取这些常量。 - 分阶段编译:先执行
make all-gcc all-target-libgcc完成主GCC工具链编译,再单独处理Go等其他语言组件,避免单个组件失败阻断整个构建流程。
内容的提问来源于stack exchange,提问作者Andrew Kay novaTopFlex
相关产品推荐
相关产品推荐

