Yeah, my usual way of explaining this is: * The compiler picks the "buckets" that the code/data is placed into, .text, .data, .bss, or special ones if you added link_section attrs * The linker places items in from each bucket into specific addrs The issue is what you're talking about though: special placement attributes aren't recursive, so functions in special sections can call functions in non-special sections. This can include functions from the stdlib. The "easiest" way to force all items into the same section is by compiling them as if they were two different independent program, with separate defined linker regions (e.g. an "all ram" program), then either treat them like a bootloader/main app, or like an OS/Userspace FFI divide