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