北大网盘导致GCC编译时随机出现错误!
[复制链接] 分享:北大网盘导致GCC编译时随机出现错误!!!
错误信息类似如下几条:
1.
[build] g++.exe: fatal error: cannot execute 'C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/14.1.0/cc1plus.exe': CreateProcess: No such file or directory
[build] compilation terminated.
2.
[build] gcc.exe: fatal error: cannot execute 'C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/14.1.0/cc1.exe': CreateProcess: No such file or directory
[build] compilation terminated.
3.
[build] make (e=5) Access Denied
[build] make (e=5) 拒绝访问
4. 或者在编译某个文件时卡死不动
以上错误几种错误会随机出现,在编译同一个文件时,即使使用完全相同的命令,不同的时间也会有不同的结果,有可能成功编译,也有可能报错。
但对于大型项目,使用cmake或者make等进行批量编译时,每个文件都有可能出现报错,导致大型项目需要重复编译许多次才能成功,极大地影响效率。
先说结论:
北大网盘使用的是Anyshare网盘,Anyshare使用类似于病毒的DLL注入Hook技术,实现快捷的共享文件下载,即双击文件时自动判断文件是否需要从网盘下载,然后再打开文件。这种方式需要注入到系统底层的DLL,影响Windows API的调用,使得gcc, g++在调用其他进程时(如cc1plus),被Anyshare拦截,随机地出现调用失败,导致无法编译。
这里是Anyshare自己对原理的解释:https://www.aishu.cn/cn/blog/412
解决方法:卸载Anyshare相关的网盘
详细信息
运行环境:
版本 Windows 11 家庭版,64 位操作系统, 基于 x64 的处理器
版本号 23H2
操作系统版本 22631.4317
体验 Windows Feature Experience Pack 1000.22700.1041.0
编译器:(以下版本的编译器均测试过,都会出错)(测试时系统中仅存在一个版本的GCC)
1.MinGW 版本 GCC 14.2.0 win32-seh-msvcrt-rt_v12-rev0
2.MinGW 版本 GCC 13.2.0
3.MinGW 版本 GCC 11.2.0 win32-seh-rt_v9-rev1
4.MSYS2 ucrt64 版本 GCC 14.1.0
项目环境:使用VSCode, 测试过cmake-3.31.0-rc2-windows-x86_64,以及VSCode中官方CMake插件中的CMake,均会出现错误
系统中安装有北大网盘2.0,但是在编译构建过程中并没有运行该软件,检查发现其也没有打开后台进程。
错误出现可能的原理
根据Anyshare的介绍,网盘为了实现功能:对共享的文件双击时,自动识别其是否已经从网盘中下载到本地,如果没有下载则现在下载,再进行双击后的打开操作。
这个功能需要使用DLL注入功能:
1.AnyShare 向一个正在运行的系统进程注入 winhook.dll(winhook64.dll);
2.AnyShare 通过设置 HOOK 对某个进程或窗口进行监视,即:对特定事件“挂钩”。一旦预定义特定事件发生-----双击文件,Windows 操作系统即会向钩子Hook发送通知消息;
3.AnyShare 响应该消息-----下载文件,响应之后再将该消息返回到Windows 操作系统消息队列中。
4.Windows 操作系统就会继续处理该消息-----打开文件。
说明:HOOK 类似于一个强盗,一旦捕获到特定事件响应处理后,也可以自己吞掉该消息,不返回到消息队列中。
当我们的g++.exe使用Win API CreatProcess调用cc1plus.exe时,触发了AnyShare的winhook注入,于是g++.exe被迫执行AnyShare实现的winhook64.dll中的代码。AnyShare可能会在此时检查该文件是否为共享,是否需要从网上下载等操作,最终执行正常CreateProcess该做的事,然后将信息返回给原来的程序g++.exe。但winhook64.dll出了差错,导致其没有或者返回了错误地信息,让g++.exe以为自己没有找到cc1plus.exe,从而导致了该错误。
附上我记录了排查过程的博客链接:
CaptainHChen (CaptainHarryChen) 在 ta 的帖子中提到:
北大网盘导致GCC编译时随机出现错误!!!
错误信息类似如下几条:
1.
……
您好,解决该问题无需卸载客户端,以下提供两种解决方案:
方案一:
客户端关闭的情况下服务还会运行,导致Hook还在生效。结束AnyShare Family7 Service服务。
方案二:
自定义HookInfo.ini文件,或使用最小化Hook注入文件替换
自定义Hooklnfo.ini文件方式:
编辑\网盘安装目录\SyncDisk\Hooklnfo.ini,默认为C:\Program Files (x86)\Bdwp\SyncDisk\Hooklnfo.ini,按照您在文中链接(https://www.aishu.cn/cn/blog/412)说明修改配置文件。
修改后需要重启AnyShare Family7 Service服务
使用最小化Hook注入文件:
替换\网盘安装目录\SyncDisk\Hooklnfo.ini
替换后需要重启AnyShare Family7 Service服务
https://disk.pku.edu.cn/link/AAB0EE50B2E2CC4E608D25A58717AB63E2
文件夹名:北大网盘最小化Hook注入
有效期限:永久有效
以上两种方式可以解决Hook影响其他软件触发Hook问题。