A Wine stub breaks my game
Stand by for Titanfall
I have the bad habit of playing video games in Linux. While the experience has improved considerably over the years thanks to proton you may still experience bullshit moments every now and then. About a month ago Titanfall 2 stopped launching all of a sudden.
Symptoms
Every launch attempt follows the same pattern. Steam reports the game is running, a few processes spin up, and ~ 5 seconds later everything silently exits. No crash dialog, no errors in steam’s output, just silence.
The kill chain
Changing the Proton version didn’t help, neither installing the latest Proton-GE.
I also removed every single launch option one by one until there were none left:
MANGOHUD=1 DISABLE_MANGOHUD_OPENGL=1 gamemoderun %command% -window -noborder
Didn’t help either.
Getting a little desperate here, I removed the entire compatdata directory for Titanfall 2.
Game over. Every subsequent launch attempt triggers the same cycle: detect update, attempt symlink swap, fail, crash.
By now, I decided to take a look at the usual suspect: EA Desktop.
An update that never landed
You’ll find EA Desktop files on your game installation, inside compatdata.
The App ID for Titanfall 2 is 1237970, so:
steamapps/compatdata/1237970/pfx/drive_c/Program Files/Electronic Arts/EA Desktop
Taking a look at its contents I can tell something must have gone wrong with what looks like a failed update:
drwxr-xr-x 3 twfox twfox 4096 Feb 8 19:43 13.616.1.6133-1770576235
drwxr-xr-x 4 twfox twfox 4096 Feb 8 19:43 13.639.0.6152-1770576199
-rw-r--r-- 1 twfox twfox 239976563 Feb 8 19:43 13.639.0.6152-1770576199.zip
-rw-r--r-- 1 twfox twfox 512 Feb 8 19:43 13.639.0.6152-1770576199.zip.sig
drwxr-xr-x 2 twfox twfox 4096 Feb 8 19:43 VC
Perhaps the logs will tell us more, the EA Desktop logs live in:
compatdata/1237970/pfx/drive_c/ProgramData/EA Desktop/Logs/
Plenty of files here, including the most obvious EADesktop.log.
There’s also EABackgroundService.log, EADestager.log, EALaunchHelper.log etc.
I don’t know what the hell any of these are, so I check EADesktop.log first and try to find the timestamp at which the game failed last time: 16:11.
EADesktop.log
[2026-02-08T16:11:31.374Z] PID:2788 TID:2872 INFO (eax::apps::startup::StartupCoordinator::checkForUpdates) Client update required, info[type[minimum], source[Network], state[Blocking]]
[2026-02-08T16:11:31.374Z] PID:2788 TID:2872 INFO (eax::apps::CommandProtocolController::handleUpdatesCheckCompleted) Updates check completed
[2026-02-08T16:11:32.442Z] PID: 2788 TID: 920 INFO (eax::apps::DesktopComponent::Impl::connectIpcClientHandlers::<lambda_23>::operator ()) Suite shutdown requested, reason[ClientUpdateDestaging]
Client update required, nice.
Next:
EABackgroundService.log
[2026-02-08T16:11:34.603Z] PID: 692 TID: 1044 INFO (eax::apps::startExecutable) Starting executable [EADestager.exe] with arguments [ --launchHelperArgument="true"]
[2026-02-08T16:23:56.755Z] PID: 692 TID: 1044 ERROR (eax::services::updater::UpdaterStateMachine::doStartup) Destager Error State found [21]
Judging by the name I’m guessing EADestager.exe is what takes care of removing the old client version and installing the new one.
EADestager.log
And here’s where it breaks:
[2026-02-08T16:11:35.791Z] PID: 2080 TID: 2084 INFO (eax::apps::tryValidateStagedFiles) Validating contents of path[C:\Program Files\Electronic Arts\EA Desktop\13.639.0.6152-1770576199\EA Desktop] against zip[C:\Program Files\Electronic Arts\EA Desktop\13.639.0.6152-1770576199.zip]
[2026-02-08T16:11:36.264Z] PID: 2080 TID: 2084 INFO (eax::apps::destager::internal::migrateToSymlinkMode) Migrating existing install to symlink mode
[2026-02-08T16:11:36.276Z] PID: 2080 TID: 2084 INFO (eax::apps::destager::internal::swapSymlinkFolders) Updating symlink to point to new client contents
[2026-02-08T16:11:36.276Z] PID: 2080 TID: 2084 INFO (eax::apps::tryValidateStagedFiles) Validating contents of path[C:\Program Files\Electronic Arts\EA Desktop\EA Desktop] against zip[C:\Program Files\Electronic Arts\EA Desktop\13.639.0.6152-1770576199.zip]
[2026-02-08T16:11:36.322Z] PID: 2080 TID: 2084 WARN (eax::apps::addErrorTelemetryImpl) UPEC-2213: Staged file missing, file[EA Desktop/bearer/qgenericbearer.dll]
[2026-02-08T16:11:36.322Z] PID: 2080 TID: 2084 WARN (eax::apps::addErrorTelemetryImpl) UPEC-2213: Staged file missing, file[EA Desktop/compatibility32/EADesktop.exe]
[2026-02-08T16:11:36.322Z] PID: 2080 TID: 2084 WARN (eax::apps::addErrorTelemetryImpl) UPEC-2213: Staged file missing, file[EA Desktop/iconengines/qsvgicon.dll]
[2026-02-08T16:11:36.322Z] PID: 2080 TID: 2084 WARN (eax::apps::addErrorTelemetryImpl) UPEC-2213: Staged file missing, file[EA Desktop/imageformats/qgif.dll]
[2026-02-08T16:11:36.322Z] PID: 2080 TID: 2084 WARN (eax::apps::addErrorTelemetryImpl) UPEC-2213: Staged file missing, file[EA Desktop/imageformats/qicns.dll]
[2026-02-08T16:11:36.324Z] PID: 2080 TID: 2084 ERROR (eax::apps::destager::internal::updateBackgroundServiceConfig) Failed to update background service config: [Executable path does not exist]
[2026-02-08T16:11:36.324Z] PID: 2080 TID: 2084 ERROR (eax::apps::destager::applyUpdate) Failed to destage update, code[21]
[2026-02-08T16:11:36.327Z] PID: 2080 TID: 2084 ERROR (eax::apps::startExecutable) Missing executable: 'C:\Program Files\Electronic Arts\EA Desktop\EA Desktop\EADesktop.exe'
No idea what UPEC-2213 is, go figure. I couldn’t find anything similar in EA app error code reference [1].
What I do know is that those Staged file missing lines are not looking good.
Out of curiosity, I ran EADestager.exe manually with Wine to see what’s what.
I’m using what I saw in the first line of EABackgroundService.log.
WINEPREFIX="/opt/steam/steamapps/compatdata/1237970/pfx" \
/home/twfox/.steam/root/compatibilitytools.d/GE-Proton10-28/files/bin/wine \
"/opt/steam/steamapps/compatdata/1237970/pfx/drive_c/Program Files/Electronic Arts/EA Desktop/13.639.0.6152-1770576199/Destager/EADestager.exe" \
--launchHelperArgument=true
I noticed this line buried in Wine’s output:
00e4:fixme:file:CreateSymbolicLinkW (L"C:\\Program Files\\Electronic Arts\\EA Desktop\\EA Desktop" L"13.639.0.6152-1770576199\\EA Desktop" 3): stub
I’m not versed in Wine but looking at Wine’s forums [2] I realized that the fixme:stub means the function is not implemented and not really doing anything.
Just in case, I decided to take a look at the source code as well.
GE-Proton 10-28 seems to be using Wine-10.0, which you can check like this:
/home/twfox/.steam/root/compatibilitytools.d/GE-Proton10-28/files/bin/wine --version
I downloaded Wine-10.0 source code and looked for this function CreateSymbolicLinkW:
1 * CreateSymbolicLinkW (kernelbase.@)
2 */
3BOOLEAN WINAPI /* DECLSPEC_HOTPATCH */ CreateSymbolicLinkW( LPCWSTR link, LPCWSTR target, DWORD flags )
4{
5 FIXME( "(%s %s %ld): stub\n", debugstr_w(link), debugstr_w(target), flags );
6 return TRUE;
7}
A very happy function, empty and just returning TRUE.
The latest wine in GitHub [3] show a very different function but unfortunately at the time I’m writing this article the latest GE-Proton 10-29 still uses Wine-10.0 so CreateSymbolicLinkW hasn’t landed yet.
We can however replicate what it is supposed to do easily with a couple commands in a shell.
The fix
First, go back to the EA Desktop directory inside the prefix:
cd /opt/steam/steamapps/compatdata/1237970/pfx/drive_c/Program\ Files/Electronic\ Arts/EA\ Desktop/
You’ll see something like this:
drwxr-xr-x 3 twfox twfox 4096 Feb 8 19:43 13.616.1.6133-1770576235
drwxr-xr-x 4 twfox twfox 4096 Feb 8 19:43 13.639.0.6152-1770576199
-rw-r--r-- 1 twfox twfox 239976563 Feb 8 19:43 13.639.0.6152-1770576199.zip
-rw-r--r-- 1 twfox twfox 512 Feb 8 19:43 13.639.0.6152-1770576199.zip.sig
drwxr-xr-x 2 twfox twfox 4096 Feb 8 19:43 VC
Copy EA Desktop directory (what contains EADesktop.exe) inside the latest version directory (13.639.0.6152-1770576199 in my case) into EA Desktop/.
Yes, its confusing. But we are just moving it to the current directory:
cp -r 13.616.1.6133-1770576999/EA\ Desktop "EA Desktop"
It shoud look like this:
drwxr-xr-x 3 twfox twfox 4096 Feb 8 19:43 13.616.1.6133-1770576235
drwxr-xr-x 4 twfox twfox 4096 Feb 8 19:43 13.639.0.6152-1770576199
-rw-r--r-- 1 twfox twfox 239976563 Feb 8 19:43 13.639.0.6152-1770576199.zip
-rw-r--r-- 1 twfox twfox 512 Feb 8 19:43 13.639.0.6152-1770576199.zip.sig
drwxr-xr-x 23 twfox twfox 12288 Feb 8 20:21 'EA Desktop'
drwxr-xr-x 2 twfox twfox 4096 Feb 8 19:43 VC
Now remove all update artifacts:
rm -rf 13.*
And finally, here we are:
drwxr-xr-x 23 twfox twfox 12288 Feb 8 20:21 'EA Desktop'
drwxr-xr-x 2 twfox twfox 4096 Feb 8 19:56 VC
After this, the directory should contain just the EA Desktop/ and VC subdirectories with the actual executable files. No staged versions, no zips, no signatures.
If I delete EA Desktop or the entire compatdata I have the same problem again. Its normal. The game must be shipping an older version of EA Desktop.
Automating the fix
This will happen again whenever EA Desktop pushes a new update. To avoid repeating the manual fix every time, you can use a wrapper script that runs before the game launches.
Save this script somewhere in your $PATH (e.g. /usr/local/bin/titanfall2-fix.sh):
#!/bin/bash
EA_DIR="/opt/steam/steamapps/compatdata/1237970/pfx/drive_c/Program Files/Electronic Arts/EA Desktop"
# Find the latest versioned directory containing EA Desktop/EADesktop.exe
latest=$(find "$EA_DIR" -maxdepth 2 -regextype posix-extended \
-regex '.*/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+-[0-9]+/EA Desktop' \
-type d 2>/dev/null | sort -V | tail -1)
if [[ -n "$latest" ]]; then
rm -rf "$EA_DIR/EA Desktop"
cp -r "$latest" "$EA_DIR/EA Desktop"
# Remove all versioned artifacts (directories, zips, signatures)
find "$EA_DIR" -maxdepth 1 -regextype posix-extended \
-regex '.*/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+-[0-9]+.*' \
-exec rm -rf {} +
fi
exec "$@"
Make it executable:
chmod +x /usr/local/bin/titanfall2-fix.sh
Then add it to your Steam launch options, before %command%:
MANGOHUD=1 DISABLE_MANGOHUD_OPENGL=1 titanfall2-fix.sh gamemoderun %command% -window -noborder
The script checks for staged versioned directories matching the EA Desktop version pattern (X.X.X.X-X). If it finds one, it applies the fix automatically.
Launching the game
After applying the fixes, the first launch will take a moment as EA Desktop initializes, but you should be all set and back on the hunt after that.