* You can use the LD_PRELOAD trick to override behavior at runtime.
* You can run with entirely different implementations of the dynamically linked library in different places.
* Software can pick up interface-compatible upgrades to its dependencies without being re-compiled and distributed again.
We use all three of these tricks in our SDKs, FWIW. But it is still a giant pain in the ass.
* You can use the LD_PRELOAD trick to override behavior at runtime.
* You can run with entirely different implementations of the dynamically linked library in different places.
* Software can pick up interface-compatible upgrades to its dependencies without being re-compiled and distributed again.
We use all three of these tricks in our SDKs, FWIW. But it is still a giant pain in the ass.