_bss_end_ofs:
        .word __bss_end__ - _start
 
+.globl _end_ofs
+_end_ofs:
+       .word _end - _start
+
 #ifdef CONFIG_USE_IRQ
 /* IRQ stack memory (calculated at run-time) */
 .globl IRQ_STACK_START
 
                *(.dynsym)
        }
 
+       _end = .;
+
        .bss __rel_dyn_start (OVERLAY) : {
                __bss_start = .;
                *(.bss)
 
 _bss_end_ofs:
        .word __bss_end__ - _start
 
+.globl _end_ofs
+_end_ofs:
+       .word _end - _start
+
 /* IRQ stack memory (calculated at run-time) + 8 bytes */
 .globl IRQ_STACK_START_IN
 IRQ_STACK_START_IN:
 
                *(.dynsym)
        }
 
+       _end = .;
+
        .bss __rel_dyn_start (OVERLAY) : {
                __bss_start = .;
                *(.bss)
 
 _bss_end_ofs:
        .word __bss_end__ - _start
 
+.globl _end_ofs
+_end_ofs:
+       .word _end - _start
+
 #ifdef CONFIG_USE_IRQ
 /* IRQ stack memory (calculated at run-time) */
 .globl IRQ_STACK_START
 
                *(.dynsym)
        }
 
+       _end = .;
+
        .bss __rel_dyn_start (OVERLAY) : {
                __bss_start = .;
                *(.bss)
 
        __bss_start = .;
        .bss : { *(.bss) }
        __bss_end__ = .;
+
+       _end = .;
 }
 
 _bss_end_ofs:
        .word __bss_end__ - _start
 
+.globl _end_ofs
+_end_ofs:
+       .word _end - _start
+
 #ifdef CONFIG_USE_IRQ
 /* IRQ stack memory (calculated at run-time) */
 .globl IRQ_STACK_START
 
                *(.dynsym)
        }
 
+       _end = .;
+
        .bss __rel_dyn_start (OVERLAY) : {
                __bss_start = .;
                *(.bss)
 
 _bss_end_ofs:
        .word __bss_end__ - _start
 
+.globl _end_ofs
+_end_ofs:
+       .word _end - _start
+
 #ifdef CONFIG_USE_IRQ
 /* IRQ stack memory (calculated at run-time) */
 .globl IRQ_STACK_START
 
                *(.dynsym)
        }
 
+       _end = .;
+
        .bss __rel_dyn_start (OVERLAY) : {
                __bss_start = .;
                *(.bss)
 
 _bss_end_ofs:
        .word __bss_end__ - _start
 
+.globl _end_ofs
+_end_ofs:
+       .word _end - _start
+
 #ifdef CONFIG_USE_IRQ
 /* IRQ stack memory (calculated at run-time) */
 .globl IRQ_STACK_START
 
                *(.dynsym)
        }
 
+       _end = .;
+
        .bss __rel_dyn_start (OVERLAY) : {
                __bss_start = .;
                *(.bss)
 
 _bss_end_ofs:
        .word __bss_end__ - _start
 
+.globl _end_ofs
+_end_ofs:
+       .word _end - _start
+
 #ifdef CONFIG_USE_IRQ
 /* IRQ stack memory (calculated at run-time) */
 .globl IRQ_STACK_START
 
                *(.dynsym)
        }
 
+       _end = .;
+
        .bss __rel_dyn_start (OVERLAY) : {
                __bss_start = .;
                *(.bss)
 
 _bss_end_ofs:
        .word __bss_end__ - _start
 
+.globl _end_ofs
+_end_ofs:
+       .word _end - _start
+
 #ifdef CONFIG_USE_IRQ
 /* IRQ stack memory (calculated at run-time) */
 .globl IRQ_STACK_START
 
                *(.dynsym)
        }
 
+       _end = .;
+
        .bss __rel_dyn_start (OVERLAY) : {
                __bss_start = .;
                *(.bss)
 
 _bss_end_ofs:
        .word __bss_end__ - _start
 
+.globl _end_ofs
+_end_ofs:
+       .word _end - _start
+
 #ifdef CONFIG_USE_IRQ
 /* IRQ stack memory (calculated at run-time) */
 .globl IRQ_STACK_START
 
                *(.dynsym)
        }
 
+       _end = .;
+
        .bss __rel_dyn_start (OVERLAY) : {
                __bss_start = .;
                *(.bss)
 
 _bss_end_ofs:
        .word __bss_end__ - _start
 
+.globl _end_ofs
+_end_ofs:
+       .word _end - _start
+
 #ifdef CONFIG_USE_IRQ
 /* IRQ stack memory (calculated at run-time) */
 .globl IRQ_STACK_START
 
                *(.dynsym)
        }
 
+       _end = .;
+
        .bss __rel_dyn_start (OVERLAY) : {
                __bss_start = .;
                *(.bss)
 
 _bss_end_ofs:
        .word __bss_end__ - _start
 
+.globl _end_ofs
+_end_ofs:
+       .word _end - _start
+
 #ifdef CONFIG_USE_IRQ
 /* IRQ stack memory (calculated at run-time) */
 .globl IRQ_STACK_START
 
                *(.dynsym)
        }
 
+       _end = .;
+
        .bss __rel_dyn_start (OVERLAY) : {
                __bss_start = .;
                *(.bss)
 
 _bss_end_ofs:
        .word __bss_end__ - _start
 
+.globl _end_ofs
+_end_ofs:
+       .word _end - _start
+
 #ifdef CONFIG_USE_IRQ
 /* IRQ stack memory (calculated at run-time) */
 .globl IRQ_STACK_START
 
                *(.dynsym)
        }
 
+       _end = .;
+
        .bss __rel_dyn_start (OVERLAY) : {
                __bss_start = .;
                *(.bss)
 
 _bss_end_ofs:
        .word __bss_end__ - _start
 
+.globl _end_ofs
+_end_ofs:
+       .word _end - _start
+
 #ifdef CONFIG_USE_IRQ
 /* IRQ stack memory (calculated at run-time) */
 .globl IRQ_STACK_START
 
                *(.dynsym)
        }
 
+       _end = .;
+
        .bss __rel_dyn_start (OVERLAY) : {
                __bss_start = .;
                *(.bss)
 
 _bss_end_ofs:
        .word __bss_end__ - _start
 
+.globl _end_ofs
+_end_ofs:
+       .word _end - _start
+
 #ifdef CONFIG_USE_IRQ
 /* IRQ stack memory (calculated at run-time) */
 .globl IRQ_STACK_START
 
                *(.dynsym)
        }
 
+       _end = .;
+
        .bss __rel_dyn_start (OVERLAY) : {
                __bss_start = .;
                *(.bss)
 
 /* for the following variables, see start.S */
 extern ulong _bss_start_ofs;   /* BSS start relative to _start */
 extern ulong _bss_end_ofs;             /* BSS end relative to _start */
+extern ulong _end_ofs;         /* end of image relative to _start */
 extern ulong IRQ_STACK_START;  /* top of IRQ stack */
 extern ulong FIQ_STACK_START;  /* top of FIQ stack */
 extern ulong _TEXT_BASE;       /* code start */
 
 
        gd->flags |= GD_FLG_RELOC;      /* tell others: relocation done */
 
-       monitor_flash_len = _bss_start_ofs;
+       monitor_flash_len = _end_ofs;
        debug ("monitor flash len: %08lX\n", monitor_flash_len);
        board_init();   /* Setup chipselects */