Gotta love the lack of symbol namespacing! ELF is really behind the PE/Mach-O world here.
I’m not sure how that would help. You can version longjmp with ELF, but that doesn’t prevent you from recompiling your code that takes a jmpbuf and someone else who calls setjmp not recompiling and passing you the wrong-sized jmpbuf. With a bit of thought towards future proofing, you’d have embedded the size in the jmpbuf.
The only way of growing jmpbuf that I’ve seen is to work is to include the size (or version) in the structure and version setjmp and longjmp. In the compat version of setjmp, you do a heap allocation for the fields that you can’t store. In longjmp, you copy those onto the stack, free, and then longjmp properly.
I’m curious about the lack of complete rebuilds. Around this time, FreeBSD finally implemented a decent package manager and made package sets a core part of the abstraction. A package is rebuilt if it has changed or if any of its dependencies have changed. If you install something that needs a newer version of something that you’ve installed as a dependency previously, the entire graph of things reachable (traversing dependency arcs in either direction) from the thing you’re installing all get upgraded. Core ABIs are allowed to change between major versions and so you get a complete package rebuild anyway then (changing the size of jmpbuf in a major release would probably be reverted).
This was in the context of having an older libc still present and be loaded at the same time (what O’Donnell proposed, IIRC).