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 105VERSION_STR = `git describe --always --dirty 2>/dev/null || echo Unknown` 106DATE_STR = `date -u` 107BUILD_COUNT_STR = `cat $(link-out-dir)/.buildcount` 108define gen-version-o 109 $(call update-buildcount,$(link-out-dir)/.buildcount) 110 @$(cmd-echo-silent) ' GEN $(link-out-dir)/version.o' 111 $(q)echo -e "const char core_v_str[] =" \ 112 "\"$(VERSION_STR) \"" \ 113 "\"#$(BUILD_COUNT_STR) \"" \ 114 "\"$(DATE_STR) \"" \ 115 "\"$(CFG_KERN_LINKER_ARCH)\";\n" \ 116 | $(CCcore) $(core-platform-cflags) \ 117 -xc - -c -o $(link-out-dir)/version.o 118endef 119$(link-out-dir)/version.o: 120 $(call gen-version-o) 121 122all: $(link-out-dir)/tee.elf 123cleanfiles += $(link-out-dir)/tee.elf $(link-out-dir)/tee.map 124cleanfiles += $(link-out-dir)/version.o 125cleanfiles += $(link-out-dir)/.buildcount 126$(link-out-dir)/tee.elf: $(objs) $(libdeps) $(link-script-pp) 127 $(call gen-version-o) 128 @$(cmd-echo-silent) ' LD $@' 129 $(q)$(LDcore) $(ldargs-tee.elf) -o $@ 130 131all: $(link-out-dir)/tee.dmp 132cleanfiles += $(link-out-dir)/tee.dmp 133$(link-out-dir)/tee.dmp: $(link-out-dir)/tee.elf 134 @$(cmd-echo-silent) ' OBJDUMP $@' 135 $(q)$(OBJDUMPcore) -l -x -d $< > $@ 136 137pageable_sections := .*_pageable 138init_sections := .*_init 139cleanfiles += $(link-out-dir)/tee-pager.bin 140$(link-out-dir)/tee-pager.bin: $(link-out-dir)/tee.elf 141 @$(cmd-echo-silent) ' OBJCOPY $@' 142 $(q)$(OBJCOPYcore) -O binary \ 143 --remove-section="$(pageable_sections)" \ 144 --remove-section="$(init_sections)" \ 145 $< $@ 146 147cleanfiles += $(link-out-dir)/tee-pageable.bin 148$(link-out-dir)/tee-pageable.bin: $(link-out-dir)/tee.elf 149 @$(cmd-echo-silent) ' OBJCOPY $@' 150 $(q)$(OBJCOPYcore) -O binary \ 151 --only-section="$(init_sections)" \ 152 --only-section="$(pageable_sections)" \ 153 $< $@ 154 155cleanfiles += $(link-out-dir)/tee-init_size.txt 156$(link-out-dir)/tee-init_size.txt: $(link-out-dir)/tee.elf 157 @$(cmd-echo-silent) ' GEN $@' 158 @echo -n 0x > $@ 159 $(q)$(NMcore) $< | grep __init_size | sed 's/ .*$$//' >> $@ 160 161cleanfiles += $(link-out-dir)/tee-init_load_addr.txt 162$(link-out-dir)/tee-init_load_addr.txt: $(link-out-dir)/tee.elf 163 @$(cmd-echo-silent) ' GEN $@' 164 @echo -n 0x > $@ 165 $(q)$(NMcore) $< | grep ' _start' | sed 's/ .*$$//' >> $@ 166 167cleanfiles += $(link-out-dir)/tee-init_mem_usage.txt 168$(link-out-dir)/tee-init_mem_usage.txt: $(link-out-dir)/tee.elf 169 @$(cmd-echo-silent) ' GEN $@' 170 @echo -n 0x > $@ 171 $(q)$(NMcore) $< | grep ' __init_mem_usage' | sed 's/ .*$$//' >> $@ 172 173all: $(link-out-dir)/tee.bin 174cleanfiles += $(link-out-dir)/tee.bin 175$(link-out-dir)/tee.bin: $(link-out-dir)/tee-pager.bin \ 176 $(link-out-dir)/tee-pageable.bin \ 177 $(link-out-dir)/tee-init_size.txt \ 178 $(link-out-dir)/tee-init_load_addr.txt \ 179 $(link-out-dir)/tee-init_mem_usage.txt \ 180 ./scripts/gen_hashed_bin.py 181 @$(cmd-echo-silent) ' GEN $@' 182 $(q)./scripts/gen_hashed_bin.py \ 183 --arch $(if $(filter y,$(CFG_ARM64_core)),arm64,arm32) \ 184 --init_size `cat $(link-out-dir)/tee-init_size.txt` \ 185 --init_load_addr_lo \ 186 `cat $(link-out-dir)/tee-init_load_addr.txt` \ 187 --init_mem_usage `cat $(link-out-dir)/tee-init_mem_usage.txt` \ 188 --tee_pager_bin $(link-out-dir)/tee-pager.bin \ 189 --tee_pageable_bin $(link-out-dir)/tee-pageable.bin \ 190 --out $@ 191 192 193all: $(link-out-dir)/tee.symb_sizes 194cleanfiles += $(link-out-dir)/tee.symb_sizes 195$(link-out-dir)/tee.symb_sizes: $(link-out-dir)/tee.elf 196 @$(cmd-echo-silent) ' GEN $@' 197 $(q)$(NMcore) --print-size --reverse-sort --size-sort $< > $@ 198 199cleanfiles += $(link-out-dir)/tee.mem_usage 200ifneq ($(filter mem_usage,$(MAKECMDGOALS)),) 201mem_usage: $(link-out-dir)/tee.mem_usage 202 203$(link-out-dir)/tee.mem_usage: $(link-out-dir)/tee.elf 204 @$(cmd-echo-silent) ' GEN $@' 205 $(q)$(READELFcore) -a -W $< | ${AWK} -f ./scripts/mem_usage.awk > $@ 206endif 207