Use the correct physical addresses in the memory map, and instead translate the addresses during postprocessing with objcopy
+INCLUDE ../common/ldscript.common\r
+\r
 ENTRY(Vector)\r
 SECTIONS\r
 {\r
-       . = 0x00010000;\r
-       .start : { obj/start.o(.text) }\r
-       .text : { *(.text) }\r
-       .rodata : { *(.rodata) }\r
-       . = 0x00200000;\r
-       .data : { *(.data) }\r
+       .start : { obj/start.o(.text) } >osimage\r
+       .text : { \r
+               *(.text)\r
+               *(.text.*)\r
+               *(.glue_7)\r
+               *(.glue_7t)\r
+       } >osimage\r
+       .rodata : { \r
+               *(.rodata) \r
+               *(.rodata*) \r
+       } >osimage\r
+       .data : { *(.data) } >ram\r
        __bss_start__ = .;\r
-       .bss : { *(.bss) }\r
+       .bss : { *(.bss) } >ram\r
        __bss_end__ = .;\r
 }\r
 
+INCLUDE ../common/ldscript.common\r
+\r
 SECTIONS\r
 {\r
-       . = 0x00002000;\r
-       .text : { obj/fpgaimg.o(.text) *(.text) }\r
-       .rodata : { *(.rodata) }\r
-       . = 0x00200000;\r
-       .data : { *(.data) }\r
+       fpgaimage : { \r
+               obj/fpgaimg.o(.text) *(.text) \r
+               *(.rodata) \r
+       } >fpgaimage\r
+       .data : { *(.data) } >ram\r
        __bss_start__ = .;\r
-       .bss : { *(.bss) }\r
+       .bss : { *(.bss) } >ram\r
        __bss_end__ = .;\r
 }\r
 
-MEMORY \r
-{\r
-       /* AT91SAM7S256 has 256k Flash and 64k RAM */\r
-       /* Important note: the correct ORIGIN for bootphase1 is 0x00100000 and for bootphase2 is 0x00100200\r
-          However, this will confuse the currently deployed flash code which expects logical and and not\r
-          physical addresses and performs no sanity checks at all. If confronted with physical addresses, \r
-          it will happily erase everything and brick the device. So for the time being pretend these addresses\r
-          to start at 0x0 while updating all the flash code with proper sanity checks, then come back later and\r
-          fix the addresses. -- Henryk Plötz <henryk@ploetzli.ch> 2009-08-27 */\r
-        bootphase1 : ORIGIN = 0x00000000, LENGTH = 0x200 /* Phase 1 bootloader: Copies real bootloader to RAM */\r
-        bootphase2 : ORIGIN = 0x00000200, LENGTH = 0x2000 - 0x200 /* Main bootloader code, stored in Flash, executed from RAM */\r
-        ram     : ORIGIN = 0x00200000, LENGTH = 64K\r
-}\r
-\r
+INCLUDE ../common/ldscript.common\r
 \r
+ENTRY(flashstart)\r
 SECTIONS\r
 {\r
     . = 0;\r
 
 $(ASMOBJ): $(OBJDIR)/%.o: %.s
        $(CC) $(CFLAGS) -mthumb-interwork -o $@ $<
 
+# This objcopy call translates physical flash addresses to logical addresses
+# See ldscript.common. -- Henryk Plötz <henryk@ploetzli.ch> 2009-08-27
 $(OBJDIR)/%.s19: $(OBJDIR)/%.elf
-       $(OBJCOPY) -Osrec --srec-forceS3 $^ $@
+       $(OBJCOPY) -Osrec --srec-forceS3  --no-change-warnings \
+       --change-section-address bootphase1-0x100000 \
+       --change-section-address bootphase2-0x100000 \
+       --change-section-address fpgaimage-0x100000 \
+       --change-section-address .start-0x100000 \
+       --change-section-address .text-0x100000 \
+       --change-section-address .rodata-0x100000 $^ $@
 
 # Automatic dependency generation
 DEPENDENCY_FILES = $(patsubst %.c,$(OBJDIR)/%.d,$(notdir $(THUMBSRC))) \
 
--- /dev/null
+/* AT91SAM7S256 has 256k Flash and 64k RAM */
+MEMORY 
+{
+       /* Important note: this memory map has the correct origins for all the flash sections.
+          However, this will confuse the currently deployed flash code which expects logical and and not
+          physical addresses and performs no sanity checks at all. If confronted with physical addresses, 
+          it will happily erase everything and brick the device. So for the time being translate these addresses
+          down in the objcopy call while updating all the flash code with proper sanity checks, then come
+          back later and fix the addresses. -- Henryk Plötz <henryk@ploetzli.ch> 2009-08-27 */
+        bootphase1 : ORIGIN = 0x00100000, LENGTH = 0x200 /* Phase 1 bootloader: Copies real bootloader to RAM */
+        bootphase2 : ORIGIN = 0x00100200, LENGTH = 0x2000 - 0x200 /* Main bootloader code, stored in Flash, executed from RAM */
+        fpgaimage  : ORIGIN = 0x00102000, LENGTH = 64k - 0x2000 /* Place where the FPGA image will end up */
+        osimage    : ORIGIN = 0x00110000, LENGTH = 256K - 64k /* Place where the main OS will end up */
+        ram        : ORIGIN = 0x00200000, LENGTH = 64K
+}
+