1# SPDX-License-Identifier: GPL-2.0+ 2# 3# (C) Copyright 2000-2002 4# Wolfgang Denk, DENX Software Engineering, wd@denx.de. 5 6ifndef CONFIG_STANDALONE_LOAD_ADDR 7ifneq ($(CONFIG_ARCH_OMAP2PLUS),) 8CONFIG_STANDALONE_LOAD_ADDR = 0x80300000 9else 10CONFIG_STANDALONE_LOAD_ADDR = 0xc100000 11endif 12endif 13 14CFLAGS_NON_EFI := -fno-pic -ffixed-r9 -ffunction-sections -fdata-sections \ 15 -fstack-protector-strong 16CFLAGS_EFI := -fpic -fshort-wchar 17 18ifneq ($(CONFIG_LTO)$(CONFIG_USE_PRIVATE_LIBGCC),yy) 19LDFLAGS_FINAL += --gc-sections 20endif 21 22ifndef CONFIG_LTO 23PLATFORM_RELFLAGS += -ffunction-sections -fdata-sections 24endif 25 26PLATFORM_RELFLAGS += -fno-common -ffixed-r9 27PLATFORM_RELFLAGS += $(call cc-option, -msoft-float) \ 28 $(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,)) 29 30# LLVM support 31LLVM_RELFLAGS := $(call cc-option,-mllvm,) \ 32 $(call cc-option,-mno-movt,) 33PLATFORM_RELFLAGS += $(LLVM_RELFLAGS) 34 35PLATFORM_CPPFLAGS += -D__ARM__ 36 37ifdef CONFIG_ARM64 38PLATFORM_ELFFLAGS += -B aarch64 -O elf64-littleaarch64 39else 40PLATFORM_ELFFLAGS += -B arm -O elf32-littlearm 41endif 42 43# Choose between ARM/Thumb instruction sets 44ifeq ($(CONFIG_$(SPL_)SYS_THUMB_BUILD),y) 45AFLAGS_IMPLICIT_IT := $(call as-option,-Wa$(comma)-mimplicit-it=always) 46PF_CPPFLAGS_ARM := $(AFLAGS_IMPLICIT_IT) \ 47 $(call cc-option, -mthumb -mthumb-interwork,\ 48 $(call cc-option,-marm,)\ 49 $(call cc-option,-mno-thumb-interwork,)\ 50 ) 51else 52PF_CPPFLAGS_ARM := $(call cc-option,-marm,) \ 53 $(call cc-option,-mno-thumb-interwork,) 54endif 55 56# Only test once 57ifeq ($(CONFIG_$(SPL_)SYS_THUMB_BUILD),y) 58archprepare: checkthumb checkgcc6 59 60checkthumb: 61 @if test "$(call cc-name)" = "gcc" -a \ 62 "$(call cc-version)" -lt "0404"; then \ 63 echo -n '*** Your GCC does not produce working '; \ 64 echo 'binaries in THUMB mode.'; \ 65 echo '*** Your board is configured for THUMB mode.'; \ 66 false; \ 67 fi 68else 69archprepare: checkgcc6 70endif 71 72checkgcc6: 73 @if test "$(call cc-name)" = "gcc" -a \ 74 "$(call cc-version)" -lt "0600"; then \ 75 echo '*** Your GCC is older than 6.0 and is not supported'; \ 76 false; \ 77 fi 78 79 80# Try if EABI is supported, else fall back to old API, 81# i. e. for example: 82# - with ELDK 4.2 (EABI supported), use: 83# -mabi=aapcs-linux 84# - with ELDK 4.1 (gcc 4.x, no EABI), use: 85# -mabi=apcs-gnu 86# - with ELDK 3.1 (gcc 3.x), use: 87# -mapcs-32 88PF_CPPFLAGS_ABI := $(call cc-option,\ 89 -mabi=aapcs-linux,\ 90 $(call cc-option,\ 91 -mapcs-32,\ 92 $(call cc-option,\ 93 -mabi=apcs-gnu,\ 94 )\ 95 )\ 96 ) 97PLATFORM_CPPFLAGS += $(PF_CPPFLAGS_ARM) $(PF_CPPFLAGS_ABI) 98 99# For EABI, make sure to provide raise() 100ifneq (,$(findstring -mabi=aapcs-linux,$(PLATFORM_CPPFLAGS))) 101# This file is parsed many times, so the string may get added multiple 102# times. Also, the prefix needs to be different based on whether 103# CONFIG_SPL_BUILD is defined or not. 'filter-out' the existing entry 104# before adding the correct one. 105PLATFORM_LIBS := arch/arm/lib/eabi_compat.o \ 106 $(filter-out arch/arm/lib/eabi_compat.o, $(PLATFORM_LIBS)) 107endif 108 109# needed for relocation 110LDFLAGS_u-boot += -pie 111 112# 113# FIXME: binutils versions < 2.22 have a bug in the assembler where 114# branches to weak symbols can be incorrectly optimized in thumb mode 115# to a short branch (b.n instruction) that won't reach when the symbol 116# gets preempted 117# 118# http://sourceware.org/bugzilla/show_bug.cgi?id=12532 119# 120ifeq ($(CONFIG_$(SPL_)SYS_THUMB_BUILD),y) 121ifeq ($(GAS_BUG_12532),) 122export GAS_BUG_12532:=$(shell if [ $(call binutils-version) -lt 0222 ] ; \ 123 then echo y; else echo n; fi) 124endif 125ifeq ($(GAS_BUG_12532),y) 126PLATFORM_RELFLAGS += -fno-optimize-sibling-calls 127endif 128endif 129 130ifneq ($(CONFIG_SPL_BUILD),y) 131# Check that only R_ARM_RELATIVE relocations are generated. 132INPUTS-y += checkarmreloc 133# The movt / movw can hardcode 16 bit parts of the addresses in the 134# instruction. Relocation is not supported for that case, so disable 135# such usage by requiring word relocations. 136PLATFORM_CPPFLAGS += $(call cc-option, -mword-relocations) 137PLATFORM_CPPFLAGS += $(call cc-option, -fno-pic) 138endif 139 140# limit ourselves to the sections we want in the .bin. 141ifdef CONFIG_ARM64 142OBJCOPYFLAGS += -j .text -j .secure_text -j .secure_data -j .rodata -j .data \ 143 -j .u_boot_list -j .rela.dyn -j .got -j .got.plt \ 144 -j .binman_sym_table -j .text_rest 145else 146OBJCOPYFLAGS += -j .text -j .secure_text -j .secure_data -j .rodata -j .hash \ 147 -j .data -j .got -j .got.plt -j .u_boot_list -j .rel.dyn \ 148 -j .binman_sym_table -j .text_rest 149endif 150 151# if a dtb section exists we always have to include it 152# there are only two cases where it is generated 153# 1) OF_EMBEDED is turned on 154# 2) unit tests include device tree blobs 155OBJCOPYFLAGS += -j .dtb.init.rodata 156 157ifdef CONFIG_EFI_LOADER 158OBJCOPYFLAGS += -j .efi_runtime -j .efi_runtime_rel 159endif 160 161ifneq ($(CONFIG_IMX_CONFIG),) 162ifdef CONFIG_SPL 163ifndef CONFIG_SPL_BUILD 164INPUTS-y += SPL 165endif 166else 167ifeq ($(CONFIG_OF_SEPARATE),y) 168INPUTS-y += u-boot-dtb.imx 169else 170INPUTS-y += u-boot.imx 171endif 172endif 173ifneq ($(CONFIG_VF610),) 174INPUTS-y += u-boot.vyb 175endif 176endif 177 178EFI_LDS := elf_arm_efi.lds 179EFI_CRT0 := crt0_arm_efi.o 180EFI_RELOC := reloc_arm_efi.o 181