1link-out-dir = $(out-dir)/core 2 3link-script = $(platform-dir)/kern.ld.S 4link-script-pp = $(link-out-dir)/kern.ld 5link-script-dep = $(link-out-dir)/.kern.ld.d 6 7AWK = awk 8 9 10link-ldflags = $(LDFLAGS) 11link-ldflags += -T $(link-script-pp) -Map=$(link-out-dir)/tee.map 12link-ldflags += --sort-section=alignment 13link-ldflags += --fatal-warnings 14link-ldflags += --print-gc-sections 15 16link-ldadd = $(LDADD) 17link-ldadd += $(addprefix -L,$(libdirs)) 18link-ldadd += $(addprefix -l,$(libnames)) 19ldargs-tee.elf := $(link-ldflags) $(objs) $(link-out-dir)/version.o \ 20 $(link-ldadd) $(libgcccore) 21 22link-script-cppflags := -DASM=1 \ 23 $(filter-out $(CPPFLAGS_REMOVE) $(cppflags-remove), \ 24 $(nostdinccore) $(CPPFLAGS) \ 25 $(addprefix -I,$(incdirscore) $(link-out-dir)) \ 26 $(cppflagscore)) 27 28entries-unpaged += tee_pager_abort_handler 29entries-unpaged += thread_init_vbar 30entries-unpaged += sm_init 31entries-unpaged += core_init_mmu_regs 32entries-unpaged += generic_boot_cpu_on_handler 33entries-unpaged += generic_boot_init_secondary 34entries-unpaged += stack_tmp_top 35objs-unpaged := \ 36 $(filter-out $(addprefix $(out-dir)/, $(objs-unpaged-rem)), $(objs)) 37ldargs-unpaged := -i --gc-sections \ 38 $(addprefix -u, $(entries-unpaged)) \ 39 $(objs-unpaged) $(link-ldadd) $(libgcccore) 40cleanfiles += $(link-out-dir)/unpaged.o 41$(link-out-dir)/unpaged.o: $(objs-unpaged) $(libdeps) $(MAKEFILE_LIST) 42 @$(cmd-echo-silent) ' LD $@' 43 $(q)$(LDcore) $(ldargs-unpaged) -o $@ 44 45cleanfiles += $(link-out-dir)/text_unpaged.ld.S: 46$(link-out-dir)/text_unpaged.ld.S: $(link-out-dir)/unpaged.o 47 @$(cmd-echo-silent) ' GEN $@' 48 $(q)$(READELFcore) -a -W $< | ${AWK} -f ./scripts/gen_ld_text_sects.awk > $@ 49 50cleanfiles += $(link-out-dir)/rodata_unpaged.ld.S: 51$(link-out-dir)/rodata_unpaged.ld.S: $(link-out-dir)/unpaged.o 52 @$(cmd-echo-silent) ' GEN $@' 53 $(q)$(READELFcore) -a -W $< | \ 54 ${AWK} -f ./scripts/gen_ld_rodata_sects.awk > $@ 55 56objs-init-rem += core/arch/arm/tee/arch_svc.o 57objs-init-rem += core/arch/arm/tee/arch_svc_asm.o 58objs-init-rem += core/arch/arm/tee/init.o 59objs-init-rem += core/arch/arm/tee/entry.o 60entries-init += _start 61objs-init := \ 62 $(filter-out $(addprefix $(out-dir)/, $(objs-init-rem)), $(objs)) 63ldargs-init := -i --gc-sections \ 64 $(addprefix -u, $(entries-init)) \ 65 $(objs-init) $(link-ldadd) $(libgcccore) 66cleanfiles += $(link-out-dir)/init.o 67$(link-out-dir)/init.o: $(objs-init) $(libdeps) $(MAKEFILE_LIST) 68 @$(cmd-echo-silent) ' LD $@' 69 $(q)$(LDcore) $(ldargs-init) -o $@ 70 71cleanfiles += $(link-out-dir)/text_init.ld.S: 72$(link-out-dir)/text_init.ld.S: $(link-out-dir)/init.o 73 @$(cmd-echo-silent) ' GEN $@' 74 $(q)$(READELFcore) -a -W $< | ${AWK} -f ./scripts/gen_ld_text_sects.awk > $@ 75 76cleanfiles += $(link-out-dir)/rodata_init.ld.S: 77$(link-out-dir)/rodata_init.ld.S: $(link-out-dir)/init.o 78 @$(cmd-echo-silent) ' GEN $@' 79 $(q)$(READELFcore) -a -W $< | \ 80 ${AWK} -f ./scripts/gen_ld_rodata_sects.awk > $@ 81 82-include $(link-script-dep) 83 84link-script-extra-deps += $(link-out-dir)/text_unpaged.ld.S 85link-script-extra-deps += $(link-out-dir)/rodata_unpaged.ld.S 86link-script-extra-deps += $(link-out-dir)/text_init.ld.S 87link-script-extra-deps += $(link-out-dir)/rodata_init.ld.S 88link-script-extra-deps += $(conf-file) 89cleanfiles += $(link-script-pp) $(link-script-dep) 90$(link-script-pp): $(link-script) $(link-script-extra-deps) 91 @$(cmd-echo-silent) ' CPP $@' 92 @mkdir -p $(dir $@) 93 $(q)$(CPPcore) -Wp,-P,-MT,$@,-MD,$(link-script-dep) \ 94 $(link-script-cppflags) $< > $@ 95 96define update-buildcount 97 @$(cmd-echo-silent) ' UPD $(1)' 98 $(q)if [ ! -f $(1) ]; then \ 99 mkdir -p $(dir $(1)); \ 100 echo 1 >$(1); \ 101 else \ 102 expr 0`cat $(1)` + 1 >$(1); \ 103 fi 104endef 105DATE_STR = `date -u` 106BUILD_COUNT_STR = `cat $(link-out-dir)/.buildcount` 107define gen-version-o 108 $(call update-buildcount,$(link-out-dir)/.buildcount) 109 @$(cmd-echo-silent) ' GEN $(link-out-dir)/version.o' 110 $(q)echo -e "const char core_v_str[] =" \ 111 "\"$(CFG_TEE_IMPL_VERSION) \"" \ 112 "\"#$(BUILD_COUNT_STR) \"" \ 113 "\"$(DATE_STR) \"" \ 114 "\"$(CFG_KERN_LINKER_ARCH)\";\n" \ 115 | $(CCcore) $(core-platform-cflags) \ 116 -xc - -c -o $(link-out-dir)/version.o 117endef 118$(link-out-dir)/version.o: 119 $(call gen-version-o) 120 121all: $(link-out-dir)/tee.elf 122cleanfiles += $(link-out-dir)/tee.elf $(link-out-dir)/tee.map 123cleanfiles += $(link-out-dir)/version.o 124cleanfiles += $(link-out-dir)/.buildcount 125$(link-out-dir)/tee.elf: $(objs) $(libdeps) $(link-script-pp) 126 $(call gen-version-o) 127 @$(cmd-echo-silent) ' LD $@' 128 $(q)$(LDcore) $(ldargs-tee.elf) -o $@ 129 130all: $(link-out-dir)/tee.dmp 131cleanfiles += $(link-out-dir)/tee.dmp 132$(link-out-dir)/tee.dmp: $(link-out-dir)/tee.elf 133 @$(cmd-echo-silent) ' OBJDUMP $@' 134 $(q)$(OBJDUMPcore) -l -x -d $< > $@ 135 136pageable_sections := .*_pageable 137init_sections := .*_init 138cleanfiles += $(link-out-dir)/tee-pager.bin 139$(link-out-dir)/tee-pager.bin: $(link-out-dir)/tee.elf 140 @$(cmd-echo-silent) ' OBJCOPY $@' 141 $(q)$(OBJCOPYcore) -O binary \ 142 --remove-section="$(pageable_sections)" \ 143 --remove-section="$(init_sections)" \ 144 $< $@ 145 146cleanfiles += $(link-out-dir)/tee-pageable.bin 147$(link-out-dir)/tee-pageable.bin: $(link-out-dir)/tee.elf 148 @$(cmd-echo-silent) ' OBJCOPY $@' 149 $(q)$(OBJCOPYcore) -O binary \ 150 --only-section="$(init_sections)" \ 151 --only-section="$(pageable_sections)" \ 152 $< $@ 153 154cleanfiles += $(link-out-dir)/tee-init_size.txt 155$(link-out-dir)/tee-init_size.txt: $(link-out-dir)/tee.elf 156 @$(cmd-echo-silent) ' GEN $@' 157 @echo -n 0x > $@ 158 $(q)$(NMcore) $< | grep __init_size | sed 's/ .*$$//' >> $@ 159 160cleanfiles += $(link-out-dir)/tee-init_load_addr.txt 161$(link-out-dir)/tee-init_load_addr.txt: $(link-out-dir)/tee.elf 162 @$(cmd-echo-silent) ' GEN $@' 163 @echo -n 0x > $@ 164 $(q)$(NMcore) $< | grep ' _start' | sed 's/ .*$$//' >> $@ 165 166cleanfiles += $(link-out-dir)/tee-init_mem_usage.txt 167$(link-out-dir)/tee-init_mem_usage.txt: $(link-out-dir)/tee.elf 168 @$(cmd-echo-silent) ' GEN $@' 169 @echo -n 0x > $@ 170 $(q)$(NMcore) $< | grep ' __init_mem_usage' | sed 's/ .*$$//' >> $@ 171 172all: $(link-out-dir)/tee.bin 173cleanfiles += $(link-out-dir)/tee.bin 174$(link-out-dir)/tee.bin: $(link-out-dir)/tee-pager.bin \ 175 $(link-out-dir)/tee-pageable.bin \ 176 $(link-out-dir)/tee-init_size.txt \ 177 $(link-out-dir)/tee-init_load_addr.txt \ 178 $(link-out-dir)/tee-init_mem_usage.txt \ 179 ./scripts/gen_hashed_bin.py 180 @$(cmd-echo-silent) ' GEN $@' 181 $(q)./scripts/gen_hashed_bin.py \ 182 --arch $(if $(filter y,$(CFG_ARM64_core)),arm64,arm32) \ 183 --init_size `cat $(link-out-dir)/tee-init_size.txt` \ 184 --init_load_addr_lo \ 185 `cat $(link-out-dir)/tee-init_load_addr.txt` \ 186 --init_mem_usage `cat $(link-out-dir)/tee-init_mem_usage.txt` \ 187 --tee_pager_bin $(link-out-dir)/tee-pager.bin \ 188 --tee_pageable_bin $(link-out-dir)/tee-pageable.bin \ 189 --out $@ 190 191 192all: $(link-out-dir)/tee.symb_sizes 193cleanfiles += $(link-out-dir)/tee.symb_sizes 194$(link-out-dir)/tee.symb_sizes: $(link-out-dir)/tee.elf 195 @$(cmd-echo-silent) ' GEN $@' 196 $(q)$(NMcore) --print-size --reverse-sort --size-sort $< > $@ 197 198cleanfiles += $(link-out-dir)/tee.mem_usage 199ifneq ($(filter mem_usage,$(MAKECMDGOALS)),) 200mem_usage: $(link-out-dir)/tee.mem_usage 201 202$(link-out-dir)/tee.mem_usage: $(link-out-dir)/tee.elf 203 @$(cmd-echo-silent) ' GEN $@' 204 $(q)$(READELFcore) -a -W $< | ${AWK} -f ./scripts/mem_usage.awk > $@ 205endif 206