@Gankra I've had to firefight now a few different upgrades at work: a surprise "oh shit one of our testing deps needs a better glibc so someone updated a docker image, and now we can't ship to customers on older linuxes", and another surprise of "this source file no longer compiles with very old gcc, we need to update our whole build tree, including static library dependencies" and tbh, I opted out of thinking deeply about this a third time for Windows as I am not actually a build expert, just someone who tries to pay attention and knows this stuff is harder than one would hope.
My best advice is never to undervalue the ability to rebuild your whole dependency tree from source, which is sometimes an easier way to get yourself out of an ABI difficulty than any other way. Rust is young enough this should still be doable. It isn't with C/C++.
One thing I specifically didn't cover was lots of the random bullshit to do with packaging C++ apps, where you have to learn that it is not the case that gcc and clang C++ objects can always be linked together, or even objects from two different versions of the same compiler without greater care than you want to know.
Actually, now I think about it, there's even C11 objects that can easily not be compatible between gcc and clang, but in that little corner of the compiler (atomics) I can also find issues linking Rust code to C/C++ code.