[U-Boot] [BUG] Cannot build qemu-x86_64_defconfig

Heinrich Schuchardt xypron.glpk at gmx.de
Tue May 22 19:29:22 UTC 2018


Hello Simon,

when I compile qemu-x86_64_defconfig on Debian the spl is close to 4GB 
large.

These files shed some light:

spl/u-boot-spl.lds
------------------
OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
OUTPUT_ARCH(i386)
ENTRY(_start)
SECTIONS
{
  . = 0xfffd0000;
  __text_start = .;
  .text : { *(.text*); }
  . = ALIGN(4);
  . = ALIGN(4);
  .u_boot_list : {
   KEEP(*(SORT(.u_boot_list*)));
  }
  . = ALIGN(4);
  .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
  . = ALIGN(4);
  .data : { *(.data*) }
  . = ALIGN(4);
  __data_end = .;
  __init_end = .;
         _image_binary_end = .;
  . = 0x120000;
  .bss (OVERLAY) : {
   __bss_start = .;
   *(.bss*)
   *(COM*)
   . = ALIGN(4);
   __bss_end = .;
  }


spl/u-boot-spl.map
--------------------------
Linker script and memory map

                 0x00000000fffd0000                . = 0xfffd0000
                 0x00000000fffd0000                __text_start = .

.text           0x00000000fffd0000     0xa0a8
....
                 0x00000000fffdc8b0                _image_binary_end = .
                 0x0000000000120000                . = 0x120000

.got            0x0000000000120000        0x4
  .got           0x0000000000120000        0x4 arch/x86/cpu/start.o




Two things are strange here:

Why is SPL using 64bit addresses while the linker script is meant for 32bit?

Why is CONFIG_SPL_TEXT_BASE defined in .config if it is ignored?

These are some of the commands executed:

   gcc -Wp,-MD,spl/net/.tftp.o.d  -nostdinc -isystem 
/usr/lib/gcc/x86_64-linux-gnu/7/include -Iinclude   -I./arch/x86/include 
-include ./include/linux/kconfig.h -D__KERNEL__ -D__UBOOT__ 
-DCONFIG_SPL_BUILD -Wall -Wstrict-prototypes -Wno-format-security 
-fno-builtin -ffreestanding -fshort-wchar -Os -fno-stack-protector 
-fno-delete-null-pointer-checks -g -fstack-usage -Wno-format-nonliteral 
-Werror=date-time -ffunction-sections -fdata-sections 
-fno-strict-aliasing -fomit-frame-pointer -fno-toplevel-reorder 
-fno-dwarf2-cfi-asm -march=i386 -m32 -mregparm=3 -D__I386__ 
-ffunction-sections -fvisibility=hidden -pipe    -D"KBUILD_STR(s)=#s" 
-D"KBUILD_BASENAME=KBUILD_STR(tftp)" 
-D"KBUILD_MODNAME=KBUILD_STR(tftp)" -c -o spl/net/tftp.o net/tftp.c
    ld.bfd   -Bsymbolic -Bsymbolic-functions -m elf_i386 --emit-relocs 
-r -o spl/net/built-in.o spl/net/checksum.o spl/net/arp.o 
spl/net/bootp.o spl/net/eth-uclass.o spl/net/eth_common.o spl/net/net.o 
spl/net/ping.o spl/net/tftp.o
   gcc -E -Wp,-MD,spl/.u-boot-spl.lds.d -D__KERNEL__ -D__UBOOT__ 
-DCONFIG_SPL_BUILD  -fno-strict-aliasing -fomit-frame-pointer 
-fno-toplevel-reorder -fno-dwarf2-cfi-asm -march=i386 -m32 -mregparm=3 
-D__I386__  -ffunction-sections -fvisibility=hidden -pipe -Iinclude 
-I./arch/x86/include -include ./include/linux/kconfig.h  -nostdinc 
-isystem /usr/lib/gcc/x86_64-linux-gnu/7/include 
-DRESET_SEG_START=0xffff0000 -DRESET_SEG_SIZE=0x10000 
-DRESET_VEC_LOC=0xfffffff0 -DSTART_16=0xfffff800 
-DRESET_BASE="CONFIG_SYS_TEXT_BASE + (CONFIG_SYS_MONITOR_LEN - 
RESET_SEG_SIZE)" -include ./include/u-boot/u-boot.lds.h -include 
./include/config.h -DCPUDIR=arch/x86/cpu  -ansi -D__ASSEMBLY__ -x 
assembler-with-cpp -P -o spl/u-boot-spl.lds arch/x86/cpu/u-boot-spl.lds
   (cd spl && ld.bfd   -Bsymbolic -Bsymbolic-functions -m elf_i386 
--emit-relocs -T u-boot-spl.lds  --gc-sections  -Bstatic --gc-sections 
--no-dynamic-linker -Ttext 0xfffd0000 arch/x86/cpu/start.o 
arch/x86/cpu/start16.o arch/x86/cpu/resetvec.o --start-group 
arch/x86/cpu/built-in.o arch/x86/lib/built-in.o 
board/emulation/qemu-x86/built-in.o common/spl/built-in.o 
common/init/built-in.o common/built-in.o cmd/built-in.o env/built-in.o 
lib/built-in.o drivers/built-in.o dts/built-in.o fs/built-in.o 
net/built-in.o  --end-group  arch/x86/lib/lib.a -Map u-boot-spl.map -o 
u-boot-spl)
   objcopy   -O binary -R .start16 -R .resetvec spl/u-boot-spl 
spl/u-boot-spl-nodtb.bin
   cp dts/dt-spl.dtb spl/u-boot-spl.dtb


Observe: ld.bfd -Ttext 0xfffd0000
This value is from include/configs/qemu-x86.h

On the other side we have spl/u-boot-spl.lds with
. = 0x120000;

This results in the size close to 4GB of the generated SPL image.

The change below relsolves the problem on qemu-x86_64_defconfig but I am 
not sure why the value 0x1200000 was introduced first hand in your patch
3c2dd537c772 ("x86: Add a link script for SPL")

diff --git a/arch/x86/cpu/u-boot-spl.lds b/arch/x86/cpu/u-boot-spl.lds
index 8a38d58f123..75be5cf5db8 100644
--- a/arch/x86/cpu/u-boot-spl.lds
+++ b/arch/x86/cpu/u-boot-spl.lds
@@ -39,7 +39,7 @@ SECTIONS

          _image_binary_end = .;

-       . = 0x120000;
+       . = 0xffff0000;
         .bss (OVERLAY) : {
                 __bss_start = .;
                 *(.bss*)

Could you, please, help to resolve the issue.

Best regards

Heinrich


More information about the U-Boot mailing list