星期四, 四月 15, 2004

ccache under cygwin

在应用ccache时,发现一个问题,在某些人的PC上,ccache的编译结果居然是错误的!开始我怀疑是不是在用ccache前后所调用的编译器不同所致,后来用objdum来查看ccache编译的.o文件,推翻了我的猜测,因为ccache编译出的.o文件格式都不对,显然不是正常编译器编译出来的结果,但在某些PC上使用ccache编译却又是正确的。
偶然的发现ccache放在缓存里的hash文件全部是正确的!而这些hash文件正是ccache调用真正的编译器编译出来的,可见编译器这个环节都没有问题,接下来问题会出在哪里?
下载了ccache的源码,分析源码,可以看出,ccache在调用编译器时会把编译结果直接定位到cache目录,而在编译前后都会试着从cache目录拷贝对应的hash文件到最终的目标文件,难道拷贝出错了? 拷贝是用的一个简单的函数,非常的简单,循环拷贝10K数据放到目标文件,直至结束。
既然问题出在拷贝上,我开始比较两个不同的目标文件,一个是用ccache编译出的,一个是直接用编译器编译出的,很直观的看出,真正编译出的目标文件中的所有0A到了ccache的结果中变成了0D 0A, 问题非常清楚了,就是因为Dos文件到Unix文件转换在作鬼,而这个转换一定是cygwin的内核cygwin1.dll做的,但是问题又来了,不同的 PC上,我用的都是同一个版本的cygwin1.dll,怎么会有不同的转换效果呢?
上网去查询了一下,终于明白,cygwin1.dll会在注册表里搜索关于磁盘mount的一些选项,其中非常重要的一个选项是按text还是 binary方式mount文件系统,不同之处就在这里,我把ccache工作正常的机器上的HKLM\software\cygnus Solutions\Cygwin\mounts v2和HKCU\software\cygnus Solutions\Cygwin\mounts v2两个分支导出到其他PC,所有PC上的ccache都工作正常了。实际上控制mount方式的KEY就是上述分支中的cygdrive flags选项,如果是0x22就是binary方式,0x20则是text方式。

0 Comments:

发表评论

<< Home