GDB partially addressed the problem by following a process of:
introducing a new interface; deprecating the old interface; provide a
legacy implementation that reverts back to the old / deprecated
mechanisms; eventually deleting the deprecated code. It has made it
possible to implement core changes without also rewrite all
targets. Target maintainers can then, later, upgrade their target - cf
frame rewrites currently occuring in GDB.
BFD follows a much simpler procedure. New interfaces are introduced,
and old interfaces remain. No deprecation, legacy implementation, or
deletion is required.