北大网盘导致GCC编译时随机出现错误! - 北京大学计算中心(PKU_CC)版 - 北大未名BBS
返回本版
1
/ 1
跳转

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

[复制链接]
楼主

CaptainHChen [离线]

CaptainHarryChen

0.0没等级

发帖数:0 原创分:0
<只看ta> <ASCIIArt>
1楼

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




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

https://blog.csdn.net/can919/article/details/143261735

https://zhuanlan.zhihu.com/p/3363271428

发表于2024-10-27 01:27:14

PKUCC [离线]

北京大学计算中心

6.6棕熊

发帖数:778 原创分:0
<只看ta> <ASCIIArt>
2楼



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问题。

发表于2024-10-27 11:56:53
楼主

CaptainHChen [离线]

CaptainHarryChen

0.0没等级

发帖数:0 原创分:0
<只看ta> <ASCIIArt>
3楼

好的,谢谢

PKUCC (北京大学计算中心) 在 ta 的帖子中提到:

您好,解决该问题无需卸载客户端,以下提供两种解决方案:

方案一:

客户端关闭的情况下服务还会运行,导致Hook还在生效。结束AnyShare Family7 Service服务。

……

发表于2024-10-27 14:15:42

leavelet [离线]

m/s

3.4扬州炒饭

发帖数:488 原创分:0
<只看ta> <ASCIIArt>
4楼

默认的Hook放低一些吧,甚至都不需要Hook。

大家用北大网盘只是传文件的,很少有人当同步盘吧

CaptainHChen (CaptainHarryChen) 在 ta 的帖子中提到:

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

错误信息类似如下几条:

1.

……

发表于2024-11-02 22:01:44

JimmyChan [在线]

用户名极难填

3.2中级站友

发帖数:349 原创分:0
<只看ta> <ASCIIArt>
5楼

因为当同步盘体验实在是太烂了(x)

leavelet (m/s) 在 ta 的帖子中提到:

默认的Hook放低一些吧,甚至都不需要Hook。

大家用北大网盘只是传文件的,很少有人当同步盘吧

发表于2024-11-07 15:51:46
返回本版
1
/ 1
跳转

请您先 登录 再进行发帖

快速回复楼主
标题
建议:≤ 24个字
签名档
发布(Ctrl+回车)

您输入的密码有误,请重新输入