Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

It's worth noting that the native Linux version of games is often buggy and a far worse experience than the Windows version running on Proton. Valve itself is infamous for this: the Left 4 Dead 2 native game has multiple very annoying bugs that have been known for 15 years, and that Valve still hasn't fixed. Unfortunately, there is (another) bug that prevents the Windows version running on Proton from connecting to VAC-secure servers or I would have ditched the Linux version long ago.

At this point game devs should just discontinue the native version if they aren't going to properly support it and just make sure the game runs flawlessly on Proton.



Time to link the famous “Win32 Is The Only Stable ABI on Linux” https://blog.hiler.eu/win32-the-only-stable-abi/

500 comments https://news.ycombinator.com/item?id=32471624


Correct me if I'm wrong, but I don't think that's an entirely fair comparison?

The syscall abi has been stable for decades, and any game that included glibc or compiled with musl keeps running just fine?


You need to include not just glibc, you also need to include ld.so sometimes, because older libs can become incompatible with current ld.so (Linux port of SMAC for example), and I fear what it might do sometimes when trying to link openGL or Vulkan driver that links to newer glibc.


Oh, is that why steam still depends on trashy 32bit-libs? Last week, after updating my Debian, steam broke because of that s**, and now I have to think about using a separate windows-machine just for this, until steam removes the 32bit-dependencies (which seems to be planned for 2026).


On my Debian system I use the flatpack version of Steam, it comes with the 32bit stuff inside the container, so you don't need any 32bit packages in the OS.


The flatpak-client starts here, but has permissions-problems with installing games. Probably because I have to use a different ssd from the one where the flatpak is installed at.


I've had the opposite experience, getting great performance in TF2 for example and even Rust on Linux (but with Rust you couldn't connect to EAC secured servers, so, useless outside of testing stuff on a private server).


That's kind of the state of Linux in general. Binaries need to be build against the correct distribution and version. Even static binaries are a gamble.


Steam takes care of the distribution and version mumbo jumbo for you with their runtime

https://github.com/ValveSoftware/steam-runtime

https://gitlab.steamos.cloud/steamrt/steam-runtime-tools/-/b...


Thanks, this is very interesting. So the old native runtime was basically a messy hacky using LD_LIBRARY_PATH and Ubuntu 12.04 libraries, and now they're using containers based on Debian 10 (Steam Runtime 2 'soldier') or Debian 11 (Steam Runtime 3 'sniper').

Edit: Valve actually have some very interesting documents about their compatibility environments:

- https://github.com/ValveSoftware/steam-runtime/blob/master/d...

- https://gitlab.steamos.cloud/steamrt/steamrt/-/blob/steamrt/...

- https://gitlab.steamos.cloud/steamrt/steamrt/-/blob/steamrt/...

- https://gitlab.steamos.cloud/steamrt/steamrt/-/blob/steamrt/...


Not entirely, but it's a lot better than 1.0/Legacy.

https://gitlab.steamos.cloud/steamrt/steam-runtime-tools/-/b...

I hope they'll drop 32-bit support in the runtime with the next major version. More and more distributions are dropping it or are thinking about it. Any new game should really use 64.


I'm not sure this is true tho.

The games by Loki Software are still running great for me. It's a matter of skill and discipline. SDL, OpenGL and alike are very stable.

The problems start when developers start to use lots of small third-party libraries and depend on particular versions of them, but IIRC on Windows it's also solved by simply shipping all the libs with the game.


Discipline? In gamedev? The industry which famously modeled trains as hats and was proud of it?


And why is that a problem if it works? What if I told you that games also don't simulate each atom individually?


Absolutely not a problem, in fact, I enjoy this. But asking game developers for "discipline" is akin to asking frontend developers for forward compatibility - simply not in their culture.


Meanwhile I love the "trains as hats" hack.


I love it too, but what game developers never have, never will and probably even never should — is discipline


Actual static binaries (so including libc) should run just fine anywhere, right? The Linux kernel has always had a very stable ABI.


Yes but that limits you to command line applications. GL and X11 (and I assume Wayland) are always linked dynamically. Granted, those don't suffer from glibc's "DLL version hell", but not sure what happens when you link the main executable statically against musl and then load DLLs which dynamically link glibc.

Another option is to dynamically link against an old glibc version, the Zig toolchain makes that easy also for C/C++ projects.


glibc doesn't suffer from DLL version hell as long as you are not doing anything stupid (like using private symbols). If you commit to using just the "C library" bits you can compile a binary linked against glibc on a distro from 1998 and it will work on modern distros just fine.

There are many issues with libraries breaking backwards compatibility on Linux (like pretty much all GUI ones) but glibc, X11, OpenGL (and to some extent SDL - it used to not be like that, but in recent years they made "SDL1->SDL2" wrappers and there is or will be a "SDL2->SDL3" wrapper too) are fine. I'm not sure about Vulkan but i'd guess that is fine too.


Last I tried the problem was linking against glibc on a new Linux distro and then attempting to run that executable on an old Linux distro which doesn't have a recent-enough glibc installed (usually Debian with their software stack from the last century).

There's probably an obscure linker trick to force an older glibc version number, but if that's the case it really should be the default since the C stdlib is supposed to be ABI backward compatible anyway.


This isn't just a glibc thing but something you can find with any shared library on Linux. For example if you are using a rolling distro and make a build that links against Qt6, the produced binary may not work in another distro that has a slightly older Qt6.

As palata mentioned the "trick" is to build using the oldest version you plan to target. You can use a Docker image with, say, Debian (which has official docker images going back to Squeeze released in 2011) to build the binary and release that.

AFAIK there are some tools that allow you to fudge symbols, etc to allow you to use whatever you have on your system but these feel like brittle solutions and the easiest one is to just build on an older/stable release. It isn't like it takes more than a second to make a VM or docker image anyway :-P.


Well the "trick" is to build with the oldest glibc version you want to support. Nothing more.


It can't be the default, otherwise using any new feature would fail.


When did glibc last introduce a new ABI-breaking feature that's commonly used by applications though?


The recent-ish change to 64 bit time_t was a fairly big one. It shouldn't affect 64 bit targets though.


glibc very much suffers from version hell, because:

a) glibc will drop older versioned symbols over time making your binary not work at all

b) glibc owns ld.so and is not afraid to make incompatible changes, which is why running Sid Meyer's Alpha Centauri linux port requires that you dig out not just libc, but the entire dynamic linking stack and know how to bypass default executable interpreter in ELF files.


...aaaaand stuff like this is exactly why NixOS is the only sensible Linux distro


NixOS removes outdated packages from its repo pretty rapidly... :-/


If you statically link musl, dlopen doesn't work at all. You can't load any shared library.


Not true even for all apps having just libc.

I wanted to port my semi-minimal 3D ECS game engine ~(10k lines) to a minimal distro, so I decided on Alpine after figuring Arch is actually very bloated on comparison.

I had to recompile even the single-executable command line prebuild system (premake5) for musl. Musl is a more minimal version of libc.

Got it to work fine after that, building a few components from source and getting a few like sdl from the distribution's repos. (also had to of course install relevant driver bits to get opengl working as the distro is truly minimal)


I would tend to agree, I think dev time is better spent supporting Proton. I have even seen benchmarks where Proton on Linux outperforms Windows. As a Steam Deck owner, Proton is fantastic.

https://www.forbes.com/sites/jasonevangelho/2024/08/21/linux...


Unless a studio is fully committed to proper Linux support (like, Feral-level), they might as well just optimize for Proton and call it a day


One of the reasons Proton has been so successful as a dev target is because the Windows API is not changing anymore and is thus stable.

The same, as I understand it, cannot be said about the Linux-native API. SteamOS may have stabilized it somewhat, but there's a reason why the readme on their site for this basically says "it may run on Linux proper, but we're not supporting it except on Steam Deck"


I started playing Silksong on my Steam Deck using the linux build. Only to discover that it maxed out at 720p (docked), and wouldn't bind right/left trigger for my controller. Enabling proton (to play the windows build) worked great. Controller worked flawlessly and the game ran smoothly at 1080p.


Yes, and sadly this is very commonplace. At this juncture, Linux builds don't make a lot of sense anymore, especially if they are not going to receive much attention when it comes to debugging. The performance penalty of Proton is small enough that it rarely matters. The worst I have seen is perhaps -20% FPS in Helldivers 2 (with an Nvidia GPU), but normally the impact is in the 0 to 10% range, so negligible for all intents and purposes.


Is this the case for BG3?


Often the linux builds do work when they are released, but then an OS update changes some dynamic linked library which then breaks them.


Except valve runs these games in well defined container runtimes to avoid these issues: https://gitlab.steamos.cloud/steamrt/steam-runtime-tools/-/b...


Somehow it's still an issue. Was a while ago now but somehow an update to dbus(?) broke Worms WMD and the publisher just never fixed it. The solution was to just run the Windows version in Proton which works fine.


I'm not certain, but WORMs WMD is a pretty old 2016 title that might predate a lot of these container runtimes being available to games other than Valve's own first party titles like Dota 2 and CSGO/CS2.

Also, Valve has recently insituted changes about how native titles work forcing existing native titles onto the scout 1.0 runtime and giving developers the ability to pick newer stable targets.

https://store.steampowered.com/news/collection/steam/?emclan...

> Native titles will execute in 'Steam for Linux runtime 1.0 (scout)' by default, instead of the legacy runtime environment. This behavior is consistent with Steam Deck and promotes better compatibility across all Linux desktop distributions. Note that this new feature can be turned off globally with "-compat-force-slr off" on the Steam client command line.

Its also the case that the original version of this that was bouncing around in the 2010s was more of a gaint shell script hack and it was possible for games to depend upon the host system in way which could break over time. Today it is utilising stuff in the flatpak ecosystem:

https://ftp.belnet.be/mirror/FOSDEM/video/2020/UD2.208/conta...


That is fascinating. So if I have a Linux version of say a game or emulator, and it seems unstable on steam deck, I could try running it in this container?


Valve already runs all native linux games I believe in the scout 1.0 runtime by default unless the vendor specifies a newer linux runtime. You can override some of this behaviour by going to the games's preferences within the steam client under "compatibility". It lets you force a specific native linux runtime or run the windows version instead using Valve's fork of wine, proton.

Sometimes if there are issues with the native linux release you can quickly swap over to the windows/proton version and see if that fixes issues.

Valve are absolute heroes in trying to create stable targets for linux gaming whether that be running windows games via proton or having a stable container target for native support.

I haven't had to boot into windows for nearly a year at this point and yet still playing new games on release without much issue (occasionally had to force to use a newer version of proton).

The only games I cannot run are competitive multiplayer games that do intrusive kernel level anti-cheat, but fortunately I don't play those games. https://areweanticheatyet.com/


Yes, owning a steam deck and using proton persuaded me to get rid of windows 11 on one of my pcs. I've been using Linux for years, but always kept switching back to windows for games and general hardware compatibility. I doubt I'll switch to windows again


I believe steam deck already does this, if not yes you can.


Pinch me when a single flake.nix takes equal care of this.


So the answer is no?


It's a "yes, for a while".


This is specifically a Steam Deck version and _not_ a general Linux version, so it's likely not applicable in this case. Think of it more like a console native port.


I would be surprised if it was hard to run it on a generic Linux.


The SD version crashes the steam overlay. I didn't check further than the menu yet.


If you want to play on Nvidia, probably yes.


Yes, BG3 crashed my Linux computer continuously so I could not even play it until I bought a ps5


I think you might be confused, there wasn't a linux-native version until yesterday.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: