Incremental over-the-air firmware updates?

My problem: my firmware is getting too large for over-the-air / over-the-wire upgrades. Thus I would like to split it into a support layer and a device-specific part, and only push the device specific part via OTA when it needs to be updated.

Has anybody done that? Any examples out there which I can learn from? I assume I’ll need some specialized linker scripts and whatnot; specifically I need to figure out how to resolve addresses in the base layer which the device-specific code might want to call. Exporting them all via a giant jump table would be somewhat unproductive …

I’m using Arduino (both AVR-8bit and STM32) right now, but if switching to something else that supports both would help I can do that.

What’s the exact limitation here? Seems like that is the foremost problem.

How did you implement over the air updates for 8-bit AVRs and STM32 chips? PIO doesn’t natively support this as far as I know; Only OTA on ESP8266 and ESP32 is there out of the box.

Code that self-flashes AVRs and STM32s isn’t that hard to find on the net.
It’s also pretty easy to write boot code that does A/B selection between two blocks of code, just (STM32) set the CPU’s vector register / (AVR) use indirect jumps depending on some in-memory flag. Presto, you can overwrite the almost-half that’s not active. The problem is that this scheme obviously breaks down when your main code is larger than 45% of flash.
Also, I want to minimize data volume, as the wires of my over-the-wire protocol are quite slow and my radio transmission times are even worse.
Thus I need to know how to tell the linker, when building part B, that part A is already on the device and can simply be jumped to when required.