Theme Preview

Windows 7 64位系统编译目标为MIPS的GCC交叉编译器失败

由 李晓岚 在 2012年04月15日发表

 

先啰嗦一下事情的起因。

前些天学习MIPS,手头却没有MIPS的C/C++编译器,于是决定使用MinGW GCC编译一套运行在Windows上的MIPS交叉编译器。机器上装的Windows 7 64位系统,事情的悲剧就此开始了。

标准流程,先编译binutils。在configure过程中,就注意到了输出比较异常,很多明明MinGW支持的C标准函数,configure脚本的检测都是不支持的。虽然很多函数都不能用,但似乎不影响binutils的编译,之后的编译顺利生成了相应工具的可执行文件。接下来编译GCC的C编译器,过程中突然某个程序发生了内存访问违例access violation。GDB调试之,最终发现异常发生的具体函数,原来是configure时检测到不支持那个函数,生成的一个简易版本的替代函数。至于生成的简易函数为什么会发生异常,原因就比较复杂了,此处略过,简而言之呢,就是由于”简易“引起的。

掐指一算,发现想修复那个替代函数不难,只是不能保证其它的替代函数就不会有问题了。最好的解决办法就是消除configure过程中对相应函数检测错误的问题。检查config.log发现如下错误:

d:/gcc/bin/../lib/gcc/mingw32/4.5.2/../../../../mingw32/bin/ld.exe: cannot open output file conftest.exe: Permission denied

手动去删除那个文件,也删不了。于是怀疑是UAC在作怪,可关掉UAC问题依旧。

几经周折,发现了问题是复现规律,最小复现步骤为:

  1. 保存一个简单的C程序源文件a.c
    #include<stdio.h>
    int main(){
    	return 0;
    }
  2. 运行命令: gcc a.c -o a.exe && a.exe && del a.exe && dir a.exe

居然还能看到a.exe文件的存在。这时再去读或写文件a.exe就会出现Permission denied。这个情景应用到configure上就是,检测xxx函数是否可用时,生成一个调用了xxx函数的C源文件,编译生成conftest.exe,然后将conftest.exe删除,通过conftest.exe是否成功生成来判断xxx函数是否可用。检测第一个函数是没有问题,当检测第二个时就发生了上面log中写的连接器错误了。

上述问题还是第一次遇到,一时没有任何解决问题的头绪,果断换XP系统来编译,结果一次就编译通过了,so happy。至于如何解决上述问题,请听下回分解。

 

标签:MIPSGCCCross-Compile

comments powered by Disqus