> However, things like LD_PRELOAD will allow this to be applied in many cases without requiring the app to be rebuilt.
While LD_PRELOAD can be used when hacking/debugging/prototyping things, it of course won't work as real solution. It requires propagating environment variables which is e.g. disabled for processes changing their credentials, it disables prelinking i.e. has noticeable effect on startup performance and memory usage and of course works only for processes that link dynamically what you're trying to override with it.
The other technique used for similar effect, ptrace, has other issues. Depending on how it's used, it's either racy or requires tricky architecture specific code (to emulate instructions with SOL) for threaded programs, it changes signal semantics and there are plain kernel bugs on some of the architectures (which AFAIK will be fixed with changes needed for utrace).