[U-Boot] Chain loading U-Boot on ARM v7, data abort

Neil Stainton nstainton at asl-control.co.uk
Mon Aug 20 10:53:10 UTC 2018


On Fri, Aug 17, 2018 at 10:57 AM, Neil Stainton <nstainton at asl-control.co.uk> wrote:

>   New Stack Pointer is: 9ef92ea0
>   Relocation Offset is: 18795000
>   Relocating to 9ff95000, new gd at 9ef92ec0, sp at 9ef92ea0
>   data abort
>   pc : [<87800c5c>]          lr : [<9ff9570c>]
>   sp : 9ef92ea0  ip : 00000030     fp : 00000017
>   r10: 878538dc  r9 : 9ef92ec0     r8 : 9ffe8e98
>   r7 : 9ef95460  r6 : 87800000     r5 : 87800320  r4 : 18795000
>   r3 : 8785c648  r2 : 8785acd0     r1 : 00000017  r0 : 18795000
>   Flags: nZCv  IRQs off  FIQs off  Mode SVC_32
>   Code: e20110ff e3510017 1a000003 e0800004 (e5901000) 
>   Resetting CPU ...

I traced this issue to the Arm linker script: The bss and __rel_dyn sections intersect. This causes 'load_elf_image_shdr' to clear a portion of the __rel_dyn table which in turn causes the 'fixloop' in relocate.S of the chained image to fail as it reads zeros instead of valid addresses.

Here's some debug output from load_elf_image_shdr which shows the order the elf sections are loaded:

  => bootelf ${loadaddr}
  Loading .text @ 0x87800000 (237976 bytes)
  Loading .rodata @ 0x8783a198 (59258 bytes)
  Loading .hash @ 0x87848914 (24 bytes)
  Loading .dtb.init.rodata @ 0x87848930 (31600 bytes)
  Loading .data @ 0x878504a0 (8620 bytes)
  Loading .got.plt @ 0x8785264c (12 bytes)
  Loading .u_boot_list @ 0x87852658 (4040 bytes)
  Loading .efi_runtime @ 0x87853620 (560 bytes)
  Loading .dynsym @ 0x8785c598 (48 bytes)
  Loading .efi_runtime_rel @ 0x87853850 (168 bytes)
  Loading .rel.dyn @ 0x878538f8 (36000 bytes)
  Clearing .bss @ 0x878538f8 (29508 bytes)
  Loading .dynstr @ 0x8785c5c8 (1 bytes)
  Loading .dynamic @ 0x8785c5cc (136 bytes)
  ## Starting application at 0x87800000 ...

.bss is being cleared after .rel.dyn is loaded, clobbering it. This can be simply fixed by removing the .bss section header from the chained elf file.

To chain a U-Boot generated Arm elf file, I prepare it by removing the .bss section and stripping the remaining debug cruft:
  ${CC}objcopy --remove-section .bss u-boot
  ${CC}strip u-boot

then once copied to the target device's memory space (at $loadaddr), I can boot it from the U-boot command prompt by entering:
  bootelf ${loadaddr}

This appears to work fine on iMX6ULL at least.

Neil



More information about the U-Boot mailing list