Linux交叉编译Win32程序时缺失i386pe.x链接脚本求助
解决MinGW-w64编译Win32程序时找不到i386pe.x链接脚本的问题
问题描述
使用x86_64-w64-mingw32-gcc hello.c -m32编译32位Windows程序时,出现链接错误:
/usr/bin/x86_64-w64-mingw32-ld: cannot open linker script file ldscripts/i386pe.x: No such file or directory collect2: error: ld returned 1 exit status
64位程序编译(不加-m32)完全正常,且系统中已找到i386pe.x文件,但位于系统ldscripts目录而非MinGW专用路径。
解决方案
1. 使用对应架构的MinGW编译器(推荐)
MinGW-w64针对不同目标架构提供了独立的交叉编译器,直接用i686-w64-mingw32-gcc编译32位Windows程序,无需额外加-m32参数:
i686-w64-mingw32-gcc hello.c -o hello_32.exe
这个编译器本身就是为32位Windows目标配置的,会自动使用正确的链接脚本和库文件路径,不会出现找不到脚本的问题。
2. 手动指定链接脚本路径(备选)
如果坚持使用x86_64-w64-mingw32-gcc + -m32,可以通过-T参数指定i386pe.x的完整路径:
x86_64-w64-mingw32-gcc hello.c -m32 -T /usr/lib/x86_64-linux-gnu/ldscripts/i386pe.x -o hello_32.exe
但这种方式需要手动维护路径,不如直接用对应架构的编译器方便。
原因分析
x86_64-w64-mingw32-gcc默认的链接脚本搜索路径是针对64位Windows目标的,添加-m32参数后,编译器没有自动切换到32位MinGW的链接脚本目录,导致ld找不到对应的i386pe.x。而i686-w64-mingw32-gcc的所有配置都是针对32位目标的,会直接加载正确路径下的链接脚本。
内容的提问来源于stack exchange,提问作者exebook
相关产品推荐
相关产品推荐

