由于 pex-unix 文件,binutils 构建失败

binutils build fails because of pex-unix file

我想交叉编译 GCC。我使用 MSYS2 作为 shell,使用 mingw-w64 作为编译器。

我已经下载了 binutils-2.25 并配置了:

../binutils/./configure --target=sh3eb-elf --prefix=C:/tempinstall/ --disable-nls

当我尝试在 libiberty/pex-unix 文件上构建 binutils 时出现错误:

In function 'pex_wait': error: 'F_GETFD' undeclared (first use in this function) error: 'FD_CLOEXEC' undeclared (first use in this function) error: 'F_SETFD' undeclared (first use in this function) error: 'F_DUPFD' undeclared (first use in this function)

In function 'restore_fd': error: 'FD_CLOEXEC' undeclared (first use in this function) error: 'F_SETFD' undeclared (first use in this function)

In function 'pex_unix_fdopenw': error: 'F_SETFD' undeclared (first use in this function) error: 'FD_CLOEXEC' undeclared (first use in this function)

几个月前我构建了相同的编译器,没有出现任何问题。但是我已经更改了 OS(Windows 7 到 W10)和编译器(MinGW-GCC 4.8 到 Mingw64-GCC 4.9)

我关注了this tutorial

我找到了解决方案:

我将 MSys2 与 msys2_shell 一起使用,将 --msys 定义为主机系统。

但是当我使用 mingw32_shell(将 --mingw32 定义为主机)时,GNU-Make 编译 pex-win32 并且工作正常

问题是,默认情况下,当 运行 GNU configure 脚本在 MSYS2 下时,buildhost 系统被报告为 i686-pc-msys , 或 x86_64-pc-msys

但是,binutils(和 gcc)的配置脚本无法识别第三部分中的 msys,因此构建默认为 Unix 构建。反过来,这会导致 pex-unix 被编译,这需要 sys/wait.h 中的 POSIX 特性,而 MinGW-w64 没有提供。

配置脚本确实有目标 mingw*cygwin* 的特殊情况,这导致编译 pex-win32.c 而不是问题。


我认为预期的解决方案是当我们想要使用 MinGW-w64 构建时,我们应该使用快捷方式 "MSYS2 MinGW 32-bit" 或 "MSYS2 MinGW 64-bit" 启动 MSYS2。这些快捷方式设置环境变量,以便将主机字符串设置为 i686-w64-mingw32i686-w64-mingw64(如果您使用 64 位 MSYS2,则在这两种情况下都是 x86_64 而不是 i686) .然后 binutils 配置脚本选择它的 mingw 案例并构建正确的东西。

但是,编译 binutils-2.28,即使它确实尝试构建 pex-win32.c,我还是遇到了一堆编译错误:_open 未声明,等等。

我没有进一步调查这个,因为我先尝试了一些其他的东西,结果证明是有效的:我启动了标准的 MSYS2 shell(不是 MinGW-w64 变体),我把 /mingw32/bin 放在PATH 的前面,我将参数 --build=i686-w64-mingw32 传递给 binutils 和 gcc 的 configure

这成功了,我能够构建一个完整的交叉工具链(实际上是针对 arm-eabi v0),它没有 MSYS2 依赖项。