北大网盘导致GCC编译时随机出现错误!

2025-09-26 05:03:27 20阅读

北大网盘导致GCC编译时随机出现错误!!!

错误信息类似如下几条:

1.

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

compilation terminated.

2.

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

compilation terminated.

3.

make (e=5) Access Denied

make (e=5) 拒绝访问

4. 或者在编译某个文件时卡死不动

以上错误几种错误会随机出现,在编译同一个文件时,即使使用完全相同的命令,不同的时间也会有不同的结果,有可能成功编译,也有可能报错。

但对于大型项目,使用cmake或者make等进行批量编译时,每个文件都有可能出现报错,导致大型项目需要重复编译许多次才能成功,极大地影响效率。

先说结论:

北大网盘使用的是Anyshare网盘,Anyshare使用类似于病毒的DLL注入Hook技术,实现快捷的共享文件下载,即双击文件时自动判断文件是否需要从网盘下载,然后再打开文件。这种方式需要注入到系统底层的DLL,影响Windows API的调用,使得gcc, g++在调用其他进程时(如cc1plus),被Anyshare拦截,随机地出现调用失败,导致无法编译。

这里是Anyshare自己对原理的解释:

解决方法:卸载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注入功能:

test1_北大网盘GCC编译错误_AnyshareDLL注入Hook技术

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,从而导致了该错误。

AnyshareDLL注入Hook技术_北大网盘GCC编译错误_test1

附上我记录了排查过程的博客链接:

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。