Linux [Linux] Co-op stuck forever on "Connecting to online services" — glibc ≥ 2.41 refuses to load the bundled Galaxy libraries

DriftCloud

Newcomer
平台:Linux(原生构建,未使用 Proton)
**发行版:** Ubuntu 26.04.1 LTS、glibc 2.43
**Steam:**官方 .deb 客户端,Steam Linux 运行时(士兵)
**游戏:**版本号 16826371,未修改(无 SMAPI)
**Steam 应用 ID:** 413150

## 症状

游戏始终停留在“正在连接到在线服务……”的界面——
标题菜单始终不出现,没有错误信息,也不会超时。
如果游戏先进入标题画面,还会阻止合作菜单的显示。

该进程并非“正在重试连接”:它处于空闲状态(主线程已阻塞)。
在 `futex_do_wait` 中(CPU 使用率约为 0%),没有网络流量,即它正在等待一个
从未设置的状态。

Steam本身运行正常。客户端已登录并连接到CM服务器:

```
[2026-10-31 14:54:00] [正在连接,4,7] Connect() 正在启动连接 (...)
[2026-10-31 14:54:00] [已连接,4,7] 正在登录...
[2026-10-31 14:54:00] [已登录, 4, 7] RecvMsgClientLogOnResponse() : 'OK'
```

游戏通过 Steam 官方运行时环境启动。
(`SteamLaunch AppId=413150`),以及`libsteam_api.so`、`steamclient.so`和
`gameoverlayrenderer.so` 全部加载到游戏进程中。禁用
代理、重启 Steam、验证文件、重新安装,以及使用或
如果没有运行时环境,一切都毫无意义。

## 根本原因

GOG Galaxy 库在仓库中提供,需要一个**可执行堆栈**:

```
$ readelf -l libGalaxy64.so | grep -A1 GNU_STACK
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RWE 0x8

$ readelf -l libGalaxyCSharpGlue.so | grep -A1 GNU_STACK
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RWE 0x8
```

自 **glibc 2.41** 版本起,动态加载器不再启用可执行堆栈。
对于通过 `dlopen()` 打开的对象,运行时加载这两个库都会失败:

```
$ cd "<Steam>/steamapps/common/Stardew Valley"
$ python3 -c“导入ctypes; ctypes.CDLL('./libGalaxy64.so')”
OSError: ./libGalaxy64.so: 无法将可执行堆栈启用为共享对象
需要:无效参数
```

错误被忽略,“在线服务就绪”状态永远不会被设置,
初始化过程将永久阻塞。受影响的发行版包括 Ubuntu 26.04,
Debian 13、Fedora 43 和当前 Arch;glibc <= 2.40 和 Proton 不受影响。

## 变通方案(已验证)

`execstack` 已不再打包在 Debian/Ubuntu 系统中,因此请使用 `patchelf`:

```
$ sudo apt install patchelf
$ cd "<Steam>/steamapps/common/Stardew Valley"
$ patchelf --clear-execstack libGalaxy64.so
$ patchelf --clear-execstack libGalaxyCSharpGlue.so
```

之后,`GNU_STACK` 变为 `RW`,两个库都加载完毕,在线/协作功能也正常工作:

```
$ python3 -c "import ctypes; ctypes.CDLL('./libGalaxy64.so'); print('ok')"
好的
```

在基于 Arch 的系统上,原始的 `execstack -c ...` 仍然有效。

注意:任何游戏更新或*验证游戏文件完整性*都会撤销此更改。

## 建议的修复方案(开发者方面)

1. 将 `libGalaxy64.so` 和 `libGalaxyCSharpGlue.so` 打包成不可执行文件。
stack(`-Wl,-z,noexecstack`,或在打包前运行`execstack -c`)。
2. 不要静默失败:如果 Galaxy SDK 无法加载且 Steam 无法启动
如果可用,请记录错误并继续,而不是阻止在线服务。
无限期。
 
Back
Top