Most environments have the OS read the
.dll and determine how best to load the program into memory.
On something like the Pokitto, you load the program into memory when you ‘flash’ the
there’s no OS on the device to do it for you, so the addresses have to be predetermined.
I believe it’s also related to memory segments.
Most people are only aware of the
.rodata sections, but other segments are sometimes used, and sometimes that’s platform specific, and the segments appear to be one of the thing linker scripts control.
Also don’t forget that ARM is memory mapped while x86 has dedicated
OUT instructions (and peripherals are usually managed by the OS anyway, so there’s no risk of accidentally writing to a device port).
I’d look into it futher, but the last thing I need at the moment is another rabbit hole to jump down,
so I’ll put it towards the back of my todo list.