Linux (the ecosystem; not necessarily the kernel) is actively hostile to binary software.
That's one of the attractions of Go, and to a lesser extent Rust; it's way less work than C to get a portable binary.
I think 90% of the problems I've encountered are due to glibc. They could easily fix all of them by adding a GCC flag that would allow you to compile against old glibc versions.
They'll never do that though because they are ideologically opposed to it.
Source software is the way to go (compiled specifically for one version of thé targeted OS, you sont have many issue)
Distribution opaque binaries are indeed not the best way, even if you can do it easily with static linking