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