evanthompson got this far, and modified the assembly to fix the error by hardcoding the offset. The kernel compiles, but did not boot. The 16MB offset solution was abandoned after this.
Here's the changes he made for reference:
--- a/arch/arm/boot/compressed/head.S
+++ b/arch/arm/boot/compressed/head.S
@@ -198,7 +198,9 @@ not_angel:
mov r4, pc
and r4, r4, #0xf8000000
/* Determine final kernel image address. */
- add r4, r4, #TEXT_OFFSET
+ add r4, r4, #0x00008000
+ add r4, r4, #0x00800000
+// add r4, r4, #TEXT_OFFSET
#else
ldr r4, =zreladdr
#endif
--- a/arch/arm/kernel/head.S
+++ b/arch/arm/kernel/head.S
@@ -52,7 +52,9 @@
.equ swapper_pg_dir, KERNEL_RAM_VADDR - PG_DIR_SIZE
.macro pgtbl, rd, phys
- add \rd, \phys, #TEXT_OFFSET
+// add \rd, \phys, #TEXT_OFFSET
+ add \rd, \phys, #0x00008000
+ add \rd, \rd, #0x00800000
sub \rd, \rd, #PG_DIR_SIZE
.endm