It depends on the distribution. Usually a distribution will settle on a version of core libraries such as libc and glibc and stick with it. The reason for doing that is comparability with binaries (i.e. if a third party company like say Mathworks that creates/sells/maintains the commercial program called Matlab wants to release a version that runs on a particular linux distribution, if the distribution constantly changes core libraries such as libc and glibc, it becomes extremely difficult to support that distribution as they might need to constantly recompile their application and release a new compatible version for that distribution).
If you want the new versions yourself, you will typically need to compile them yourself for your linux distribution and setup your environmental variables to point to them when you need them or want to compile code against them.
Personally I create a directory/automount point called something like "/software". I will then install all the items that I compile under there, so I will have things like "/software/binutils/binutils2.25", "/software/binutils/binutils2.39", "/software/gcc/gcc8.2.0", "/software/gcc/gcc8.5.0", "/software/gcc/gcc10.4.0", etc..... This way I do not have conflicts with anything installed by the OS, and can point to these areas for software that I develop or compile so that they can get the appropriate version of the libraries they require even if my distribution has not released a package with that version of the software by just changing my various shell enviornmental variables like PATH, LD_LIBRARY_PATH, LD_PRELOAD, etc., so that what I want to use is the version found first.