[Share Experiences] 星火商店版微信在UOSv25龙芯版运行崩溃问题的研究
Tofloor
poster avatar
MeGusta
deepin
6 hours ago
Author

星火商店版的微信在Deepinv25龙芯版可以正常运行,但是在UOSv25系统中无法运行。

以下是用WorkBuddy定位的结果(部分内容手动删改):

环境

  • 系统:UOS Desktop 25 Professional(loong64)
  • 内核:6.6.0-loong64-desktop
  • 微信:wechat 4.1.13.3~spark1(星火商店版)
  • 兼容组件:星火安装时连带拉入依赖 liblol 0.1.10-2 + liblol-dkms 0.1.1
  • 系统自带:liblol 0.1.6-1deepin1,app_compat 内核模块,内置旧世界版distrobox子系统uos-rootfs-20(使用“兼容模式安装”软件时自动安装)。

现象

从星火商店安装微信,直接运行 /usr/bin/wechat(或点桌面图标)立即崩溃:

*** stack smashing detected ***: terminated
*** stack smashing detected ***: terminated
已放弃(核心已转储)

崩溃 100% 复现,与用户数据无关。

定位过程(简述)

  1. coredumpctl 回溯:wechat main → MMInitCrashpadExport → __libc_fork → _Fork → __stack_chk_fail 崩点在 crashpad 初始化的 fork 路径,_Fork 栈帧 canary 被破坏。

  2. strace 显示崩溃窗口内只有 rt_sigprocmask(sigsetsize=8,透明分支)→ clonert_sigprocmask 三个系统调用,clone flags 正常,排除微信自身问题。

  3. 反汇编 liblol glibc 2.42 的 _Fork,确认崩溃点在 fork 返回后的信号掩码恢复路径。

  4. 关键发现:系统同时存在两套旧世界兼容层——

    • UOS 自带 app_compat kmod(kprobe 挂 rt_sig*/pselect6/ppoll/epoll_pwait/signalfd4 等,gate 在 TIF_ELF_OBJ_V0
    • 星火拉入的 liblol la_ow_syscall kmod(同样 kprobe 挂一批信号系 syscall)
  5. 对照实验:

    • 只留 app_compat + liblol 0.1.10 → 仍然崩
    • 卸载 app_compat + liblol 0.1.10 → 通过 fork 初始化
    • 卸载 app_compat + 加载 la_ow_syscall + liblol 0.1.10 → 微信完整启动

根因

两套旧世界兼容层存在冲突

  • liblol 0.1.10 的用户态 glibc(2.42)是按「配套 la_ow_syscall 内核模块」设计的
  • UOS 25 的内核侧旧世界翻译是自家 app_compat 模块,官方配对的是 liblol 0.1.6-1deepin1(changelog 显示该包只是 Uniontech 用 GCC 12 重编译的上游 0.1.6)
  • 星火商店的微信包在 UOS 25 上拉入了 liblol 0.1.10,而系统自带的 app_compat 并不认识新版 glibc 的约定 → app_compat 的 kprobe 处理器改写系统调用参数时踩坏 _Fork 栈 → stack smashing

修复方案

两种组合均已实测可完整启动微信(主进程 / crashpad / wxocr / wxplayer / WeChatAppEx 全部存活)。

方案 A:回到 UOS 官方组合(安装官方包方便,但不兼容星火商店中的旧世界转置包)

# 卸载星火版微信,降级liblol:
sudo apt remove -y liblol-dkms                                # 移除 la_ow_syscall 模块  
sudo apt install -y --allow-downgrades liblol=0.1.6-1deepin1  # 降级到 UOS 官方配套版  

然后以“兼容模式安装”腾讯官方loongarch64版本的微信,以及其他旧世界的deb包。

兼容环境的管理,就是distrobox的那一套,在此不再赘述。

方案 B:保留 liblol 0.1.10,屏蔽 app_compat(安装行为可与Deepin一致)

# 确保 liblol-dkms 已装(la_ow_syscall 模块)
sudo tee /etc/modprobe.d/blacklist-app-compat.conf <
Reply Favorite View the author
All Replies

No replies yet