Der Prozessor nimmt die Addressen die reincompiliert sind, welche bei 0xc0000000 liegen, die physische Addresse ist nur im elf-binary vermerkt, damit GRUB weis, wo es das elf-binary hinladen soll; dort wird es auch ausgeführt! Das Problem ist nur, dass der Code bei 0x100000 läuft und alle Referenzen im Code auf 0xc0000000 zeigen, deswegen muss man auch in dieser Zeit auf alle Variablenzugriffe achten und die Addressen wenn nötig per Hand umrechnen lassen. Für Near-Jumps und -Calls ist das kein Problem, weil deren Sprungaddressen relative Werte sind und demnach unabhängig vom momentanen Instruction Pointer sind. D.h. kannst du beruhigt irgendwelche Funktionen aufrufen, solange alle Variablenzugriffe in diesen angepasst sind.