Linux下构建Cygwin工具链编译Binutils遇__strcpy_chk未定义错误
问题
在Linux环境下通过GitHub Actions,基于Fedora最新版Docker容器构建Cygwin工具链时,编译Binutils出现如下链接错误:
/usr/lib/gcc/x86_64-w64-mingw32/12.2.1/../../../../x86_64-w64-mingw32/bin/ld: /usr/x86_64-w64-mingw32/sys-root/mingw/lib/../lib/libmingwex.a(lib64_libmingwex_a-dirent.o):(.text+0x2bc): undefined reference to `__strcpy_chk'
相关环境参数:
- Build = x86_64-linux-gnu
- Host = x86_64-w64-mingw32
- Target = x86_64-pc-cygwin
使用的configure脚本:
BINUTILS_V = 2.41 INSTALL_PATH = ../"binutils-$BINUTILS_V"/configure \ --quiet \ --prefix="$INSTALL_PATH" \ --disable-gdb \ --build=x86_64-linux-gnu \ --host=x86_64-w64-mingw32 \ --target=x86_64-pc-cygwin \ --disable-libdecnumber \ --disable-readline \ --disable-sim \ --enable-64-bit-bfd \ --enable-install-libiberty \ --enable-targets=x86_64-pc-cygwin,i686-pc-cygwin \ --with-gcc-major-version-only \ --disable-shared \ --disable-host-shared \ lt_cv_deplibs_check_method=pass_all
解决方法
- 显式链接libssp库
__strcpy_chk属于GCC的栈保护库(libssp),在configure命令前添加LDFLAGS="-lssp"参数,强制链接该库:
LDFLAGS="-lssp" ../"binutils-$BINUTILS_V"/configure \ # 原configure参数保持不变
- 关闭Fortify安全编译选项
如果不需要栈保护功能,可通过CFLAGS禁用_FORTIFY_SOURCE,避免编译器生成对__strcpy_chk的调用:
CFLAGS="-U_FORTIFY_SOURCE -O2" ../"binutils-$BINUTILS_V"/configure \ # 原configure参数保持不变
- 补全mingw工具链依赖
确保Fedora容器中安装了完整的mingw64工具链,执行以下命令补充缺失的库:
dnf install -y mingw64-gcc mingw64-gcc-c++ mingw64-libssp
验证libssp.a或libssp.dll.a存在于/usr/x86_64-w64-mingw32/sys-root/mingw/lib目录下。
- 调整host参数(备选)
若目标是构建Linux上运行的Cygwin交叉工具链(而非Windows上运行的工具链),可将--host=x86_64-w64-mingw32改为--host=x86_64-linux-gnu,避免依赖mingw的系统库。
内容的提问来源于stack exchange,提问作者7dog123
相关产品推荐
相关产品推荐

