arch: Add explicit linker script for u-boot-elf
Commit f4dc714aaa
("arm64: Turn u-boot.bin back into an ELF file after
relocate-rela")
introduce REMAKE_ELF option to recreate u-boot.elf from u-boot ->
u-boot.bin + DT -> u-boot.elf.
The best is to ilustrate it from make V=1 output
cat u-boot-nodtb.bin dts/dt.dtb > u-boot-dtb.bin
cp u-boot-dtb.bin u-boot.bin
aarch64-linux-gnu-objcopy -I binary -B aarch64 -O elf64-littleaarch64 u-boot.bin u-boot-elf.o
aarch64-linux-gnu-ld.bfd u-boot-elf.o -o u-boot.elf --defsym="_start"=0x8000000 -Ttext=0x8000000
Last command has no explicit linker script passed that's why toolchain
internal linker script is used.
In Binutils 2.32 case it contains SIZEOF_HEADERS symbol which has changed
behavior by commit
https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=64029e93683a266c38d19789e780f3748bd6a188
which result in situation that program headers has changed from
(xilinx_zynqmp_mini_defconfig)
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
LOAD 0x0000000000010000 0x00000000fffc0000 0x00000000fffc0000
0x0000000000018918 0x0000000000018918 RW 0x10000
to
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
LOAD 0x0000000000000000 0x00000000fffb0000 0x00000000fffb0000
0x0000000000028918 0x0000000000028918 RW 0x10000
Xilinx tools like XSDB or Bootgen are using program headers for loading ELF
to the right location and by above binutils change ELF is loaded to
incorrect location.
The patch is explicitly use u-boot-elf.lds (just cat now) for u-boot.elf
recreation which is called when REMAKE_ELF is setup.
By purpose u-boot-elf.lds doesn't contain OUTPUT_FORMAT/OUTPUT_ARCH to be
able to use by all archs.
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
Reviewed-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
Tested-By: Álvaro Fernández Rojas <noltari@gmail.com>
This commit is contained in:
parent
740370282e
commit
e14ba8a577
5
Kconfig
5
Kconfig
@ -299,6 +299,11 @@ config ERR_PTR_OFFSET
|
||||
pointer values - up to 'MAX_ERRNO' bytes below this value must be
|
||||
unused/invalid addresses.
|
||||
|
||||
config PLATFORM_ELFENTRY
|
||||
string
|
||||
default "__start" if MIPS
|
||||
default "_start"
|
||||
|
||||
endmenu # General setup
|
||||
|
||||
menu "Boot images"
|
||||
|
11
Makefile
11
Makefile
@ -1647,18 +1647,17 @@ OBJCOPYFLAGS_u-boot-img-spl-at-end.bin := -I binary -O binary \
|
||||
u-boot-img-spl-at-end.bin: u-boot.img spl/u-boot-spl.bin FORCE
|
||||
$(call if_changed,pad_cat)
|
||||
|
||||
# Create a new ELF from a raw binary file.
|
||||
ifndef PLATFORM_ELFENTRY
|
||||
PLATFORM_ELFENTRY = "_start"
|
||||
endif
|
||||
quiet_cmd_u-boot-elf ?= LD $@
|
||||
cmd_u-boot-elf ?= $(LD) u-boot-elf.o -o $@ \
|
||||
--defsym=$(PLATFORM_ELFENTRY)=$(CONFIG_SYS_TEXT_BASE) \
|
||||
-T u-boot-elf.lds --defsym=$(CONFIG_PLATFORM_ELFENTRY)=$(CONFIG_SYS_TEXT_BASE) \
|
||||
-Ttext=$(CONFIG_SYS_TEXT_BASE)
|
||||
u-boot.elf: u-boot.bin
|
||||
u-boot.elf: u-boot.bin u-boot-elf.lds
|
||||
$(Q)$(OBJCOPY) -I binary $(PLATFORM_ELFFLAGS) $< u-boot-elf.o
|
||||
$(call if_changed,u-boot-elf)
|
||||
|
||||
u-boot-elf.lds: arch/u-boot-elf.lds prepare FORCE
|
||||
$(call if_changed_dep,cpp_lds)
|
||||
|
||||
# MediaTek's ARM-based u-boot needs a header to contains its load address
|
||||
# which is parsed by the BootROM.
|
||||
# If the SPL build is enabled, the header will be added to the spl binary,
|
||||
|
@ -36,7 +36,6 @@ CONFIG_STANDALONE_LOAD_ADDR ?= 0xffffffff80200000
|
||||
endif
|
||||
|
||||
PLATFORM_CPPFLAGS += -D__MIPS__
|
||||
PLATFORM_ELFENTRY = "__start"
|
||||
PLATFORM_ELFFLAGS += -B mips $(OBJCOPYFLAGS)
|
||||
|
||||
#
|
||||
|
9
arch/u-boot-elf.lds
Normal file
9
arch/u-boot-elf.lds
Normal file
@ -0,0 +1,9 @@
|
||||
ENTRY(CONFIG_PLATFORM_ELFENTRY)
|
||||
SECTIONS
|
||||
{
|
||||
. = CONFIG_PLATFORM_ELFENTRY;
|
||||
|
||||
.data : {
|
||||
*(.data*)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user