xref: /optee_os/core/arch/arm/kernel/link.mk (revision f3434bd381191cbe74b959e0c4884060a5df0e4c)
11f09fc53SJerome Forissierlink-out-dir = $(out-dir)/core
21f09fc53SJerome Forissier
35cc9ca58SMarouene Boubakrilink-script-dummy = $(arch-dir)/kernel/link_dummy.ld
46afb8533SAndrew F. Davislink-script = $(if $(wildcard $(platform-dir)/kern.ld.S), \
56afb8533SAndrew F. Davis		$(platform-dir)/kern.ld.S, \
65cc9ca58SMarouene Boubakri		$(arch-dir)/kernel/kern.ld.S)
71f09fc53SJerome Forissierlink-script-pp = $(link-out-dir)/kern.ld
81f09fc53SJerome Forissierlink-script-dep = $(link-out-dir)/.kern.ld.d
91f09fc53SJerome Forissier
101f09fc53SJerome ForissierAWK	 = awk
111f09fc53SJerome Forissier
122f4d97e7SJerome Forissierlink-ldflags-common += $(call ld-option,--no-warn-rwx-segments)
132f4d97e7SJerome Forissierifeq ($(CFG_ARM32_core),y)
142f4d97e7SJerome Forissierlink-ldflags-common += $(call ld-option,--no-warn-execstack)
152f4d97e7SJerome Forissierendif
162f4d97e7SJerome Forissier
171f09fc53SJerome Forissierlink-ldflags  = $(LDFLAGS)
180d928692SJens Wiklanderifeq ($(call cfg-one-enabled, CFG_CORE_ASLR CFG_CORE_PHYS_RELOCATABLE),y)
19f1fee325SJerome Forissierlink-ldflags += -pie -Bsymbolic -z norelro $(ldflag-apply-dynamic-relocs)
20f1fee325SJerome Forissierifeq ($(CFG_ARM64_core),y)
21f1fee325SJerome Forissierlink-ldflags += -z text
22f1fee325SJerome Forissierelse
23f1fee325SJerome Forissier# Suppression of relocations in read-only segments has not been done yet
24f1fee325SJerome Forissierlink-ldflags += -z notext
25f1fee325SJerome Forissierendif
26170e9084SJens Wiklanderendif
2748685b6cSJerome Forissierifeq ($(CFG_CORE_BTI),y)
2848685b6cSJerome Forissier# force-bti tells the linker to warn if some object files lack the .note.gnu.property
2948685b6cSJerome Forissier# section with the BTI flag, and to turn on the BTI flag in the output anyway. The
3048685b6cSJerome Forissier# resulting executable would likely fail at runtime so we use this flag along
3148685b6cSJerome Forissier# with the --fatal-warnings below to check and prevent this situation (with useful
3248685b6cSJerome Forissier# diagnostics).
3348685b6cSJerome Forissierlink-ldflags += $(call ld-option,-z force-bti) --fatal-warnings
3448685b6cSJerome Forissierendif
351f09fc53SJerome Forissierlink-ldflags += -T $(link-script-pp) -Map=$(link-out-dir)/tee.map
361f09fc53SJerome Forissierlink-ldflags += --sort-section=alignment
371f09fc53SJerome Forissierlink-ldflags += --fatal-warnings
3849d0f60dSJens Wiklanderlink-ldflags += --gc-sections
392f4d97e7SJerome Forissierlink-ldflags += $(link-ldflags-common)
401f09fc53SJerome Forissier
411f09fc53SJerome Forissierlink-ldadd  = $(LDADD)
4260c2d1dfSJorge Ramirez-Ortizlink-ldadd += $(ldflags-external)
432b39fbe0SJens Wiklanderlink-ldadd += $(libdeps)
4466f79941SJens Wiklanderlink-objs := $(filter-out \
4561487fe8SEtienne Carriere	       $(out-dir)/$(platform-dir)/link_dummies_paged.o \
4661487fe8SEtienne Carriere	       $(out-dir)/$(platform-dir)/link_dummies_init.o \
475cc9ca58SMarouene Boubakri	       $(out-dir)/$(arch-dir)/kernel/link_dummies_paged.o \
485cc9ca58SMarouene Boubakri	       $(out-dir)/$(arch-dir)/kernel/link_dummies_init.o, \
4966f79941SJens Wiklander	       $(objs))
5066f79941SJens Wiklanderlink-objs-init := $(filter-out \
5161487fe8SEtienne Carriere		    $(out-dir)/$(platform-dir)/link_dummies_init.o \
525cc9ca58SMarouene Boubakri		    $(out-dir)/$(arch-dir)/kernel/link_dummies_init.o, \
5395e4998aSJens Wiklander		    $(objs))
5495e4998aSJens Wiklanderldargs-tee.elf := $(link-ldflags) $(link-objs) $(link-out-dir)/version.o \
5545fecab0SJens Wiklander		  $(link-ldadd)
561f09fc53SJerome Forissier
57df7712baSJens Wiklanderlink-script-cppflags := \
581f09fc53SJerome Forissier	$(filter-out $(CPPFLAGS_REMOVE) $(cppflags-remove), \
591f09fc53SJerome Forissier		$(nostdinccore) $(CPPFLAGS) \
601f09fc53SJerome Forissier		$(addprefix -I,$(incdirscore) $(link-out-dir)) \
611f09fc53SJerome Forissier		$(cppflagscore))
621f09fc53SJerome Forissier
635976a0a5SJens Wiklanderldargs-all_objs := -T $(link-script-dummy) --no-check-sections \
642f4d97e7SJerome Forissier		   $(link-ldflags-common) \
65*f3434bd3SJens Wiklander		   $(link-objs) $(link-ldadd)
669fa130bfSJens Wiklandercleanfiles += $(link-out-dir)/all_objs.o
679fa130bfSJens Wiklander$(link-out-dir)/all_objs.o: $(objs) $(libdeps) $(MAKEFILE_LIST)
689fa130bfSJens Wiklander	@$(cmd-echo-silent) '  LD      $@'
699fa130bfSJens Wiklander	$(q)$(LDcore) $(ldargs-all_objs) -o $@
709fa130bfSJens Wiklander
719fa130bfSJens Wiklandercleanfiles += $(link-out-dir)/unpaged_entries.txt
729fa130bfSJens Wiklander$(link-out-dir)/unpaged_entries.txt: $(link-out-dir)/all_objs.o
739fa130bfSJens Wiklander	@$(cmd-echo-silent) '  GEN     $@'
749fa130bfSJens Wiklander	$(q)$(NMcore) $< | \
759fa130bfSJens Wiklander		$(AWK) '/ ____keep_pager/ { printf "-u%s ", $$3 }' > $@
769fa130bfSJens Wiklander
770b8a917fSJerome Forissierunpaged-ldargs := -T $(link-script-dummy) --no-check-sections --gc-sections \
782f4d97e7SJerome Forissier		 $(link-ldflags-common)
79*f3434bd3SJens Wiklanderunpaged-ldadd := $(objs) $(link-ldadd)
801f09fc53SJerome Forissiercleanfiles += $(link-out-dir)/unpaged.o
819fa130bfSJens Wiklander$(link-out-dir)/unpaged.o: $(link-out-dir)/unpaged_entries.txt
8262428631SJens Wiklander	@$(cmd-echo-silent) '  LD      $@'
8395e4998aSJens Wiklander	$(q)$(LDcore) $(unpaged-ldargs) \
849fa130bfSJens Wiklander		`cat $(link-out-dir)/unpaged_entries.txt` \
8595e4998aSJens Wiklander		$(unpaged-ldadd) -o $@
861f09fc53SJerome Forissier
879ac870c9SJerome Forissiercleanfiles += $(link-out-dir)/text_unpaged.ld.S
881f09fc53SJerome Forissier$(link-out-dir)/text_unpaged.ld.S: $(link-out-dir)/unpaged.o
8962428631SJens Wiklander	@$(cmd-echo-silent) '  GEN     $@'
905976a0a5SJens Wiklander	$(q)$(READELFcore) -S -W $< | \
91b4faf480SDick Olsson		$(PYTHON3) ./scripts/gen_ld_sects.py .text. > $@
921f09fc53SJerome Forissier
939ac870c9SJerome Forissiercleanfiles += $(link-out-dir)/rodata_unpaged.ld.S
941f09fc53SJerome Forissier$(link-out-dir)/rodata_unpaged.ld.S: $(link-out-dir)/unpaged.o
9562428631SJens Wiklander	@$(cmd-echo-silent) '  GEN     $@'
965976a0a5SJens Wiklander	$(q)$(READELFcore) -S -W $< | \
97b4faf480SDick Olsson		$(PYTHON3) ./scripts/gen_ld_sects.py .rodata. > $@
981f09fc53SJerome Forissier
999fa130bfSJens Wiklander
1009fa130bfSJens Wiklandercleanfiles += $(link-out-dir)/init_entries.txt
1019fa130bfSJens Wiklander$(link-out-dir)/init_entries.txt: $(link-out-dir)/all_objs.o
1029fa130bfSJens Wiklander	@$(cmd-echo-silent) '  GEN     $@'
1039fa130bfSJens Wiklander	$(q)$(NMcore) $< | \
1049fa130bfSJens Wiklander		$(AWK) '/ ____keep_init/ { printf "-u%s ", $$3 }' > $@
1059fa130bfSJens Wiklander
1060b8a917fSJerome Forissierinit-ldargs := -T $(link-script-dummy) --no-check-sections --gc-sections \
1072f4d97e7SJerome Forissier	       $(link-ldflags-common)
108*f3434bd3SJens Wiklanderinit-ldadd := $(link-objs-init) $(link-out-dir)/version.o  $(link-ldadd)
1091f09fc53SJerome Forissiercleanfiles += $(link-out-dir)/init.o
1109fa130bfSJens Wiklander$(link-out-dir)/init.o: $(link-out-dir)/init_entries.txt
111780f2a6aSJerome Forissier	$(call gen-version-o)
11262428631SJens Wiklander	@$(cmd-echo-silent) '  LD      $@'
11395e4998aSJens Wiklander	$(q)$(LDcore) $(init-ldargs) \
1149fa130bfSJens Wiklander		`cat $(link-out-dir)/init_entries.txt` \
11595e4998aSJens Wiklander		$(init-ldadd) -o $@
1161f09fc53SJerome Forissier
1179ac870c9SJerome Forissiercleanfiles += $(link-out-dir)/text_init.ld.S
1181f09fc53SJerome Forissier$(link-out-dir)/text_init.ld.S: $(link-out-dir)/init.o
11962428631SJens Wiklander	@$(cmd-echo-silent) '  GEN     $@'
1205976a0a5SJens Wiklander	$(q)$(READELFcore) -S -W $< | \
121b4faf480SDick Olsson		$(PYTHON3) ./scripts/gen_ld_sects.py .text. > $@
1221f09fc53SJerome Forissier
1239ac870c9SJerome Forissiercleanfiles += $(link-out-dir)/rodata_init.ld.S
1241f09fc53SJerome Forissier$(link-out-dir)/rodata_init.ld.S: $(link-out-dir)/init.o
12562428631SJens Wiklander	@$(cmd-echo-silent) '  GEN     $@'
126b4faf480SDick Olsson	$(q)$(READELFcore) -S -W $< | $(PYTHON3) ./scripts/gen_ld_sects.py .rodata. > $@
1271f09fc53SJerome Forissier
1281f09fc53SJerome Forissier-include $(link-script-dep)
1291f09fc53SJerome Forissier
1301f09fc53SJerome Forissierlink-script-extra-deps += $(link-out-dir)/text_unpaged.ld.S
1311f09fc53SJerome Forissierlink-script-extra-deps += $(link-out-dir)/rodata_unpaged.ld.S
1321f09fc53SJerome Forissierlink-script-extra-deps += $(link-out-dir)/text_init.ld.S
1331f09fc53SJerome Forissierlink-script-extra-deps += $(link-out-dir)/rodata_init.ld.S
1341f09fc53SJerome Forissierlink-script-extra-deps += $(conf-file)
1351f09fc53SJerome Forissiercleanfiles += $(link-script-pp) $(link-script-dep)
1361f09fc53SJerome Forissier$(link-script-pp): $(link-script) $(link-script-extra-deps)
13762428631SJens Wiklander	@$(cmd-echo-silent) '  CPP     $@'
1381f09fc53SJerome Forissier	@mkdir -p $(dir $@)
1390ae5ef34SThomas Bourgoin	$(q)$(CPPcore) -P -MT $@ -MD -MP -MF $(link-script-dep) \
1402f6dffbdSJerome Forissier		$(link-script-cppflags) $< -o $@
1411f09fc53SJerome Forissier
142fd1bdc6bSJerome Forissier$(link-out-dir)/version.o:
143fd1bdc6bSJerome Forissier	$(call gen-version-o)
144fd1bdc6bSJerome Forissier
145bdc1a182SJerome Forissier-include $(link-out-dir)/.tee.elf.cmd
146bdc1a182SJerome Forissierdefine check-link-objs
147bdc1a182SJerome Forissier$(if $(strip $(filter-out $(link-objs), $(old-link-objs))
148bdc1a182SJerome Forissier	     $(filter-out $(old-link-objs), $(link-objs))), FORCE_LINK := FORCE)
149bdc1a182SJerome Forissierendef
150bdc1a182SJerome Forissier$(eval $(call check-link-objs))
15195e4998aSJens Wiklander
1521f09fc53SJerome Forissierall: $(link-out-dir)/tee.elf
1531f09fc53SJerome Forissiercleanfiles += $(link-out-dir)/tee.elf $(link-out-dir)/tee.map
154fd1bdc6bSJerome Forissiercleanfiles += $(link-out-dir)/version.o
155fd1bdc6bSJerome Forissiercleanfiles += $(link-out-dir)/.buildcount
156bdc1a182SJerome Forissiercleanfiles += $(link-out-dir)/.tee.elf.cmd
157bdc1a182SJerome Forissier$(link-out-dir)/tee.elf: $(link-objs) $(libdeps) $(link-script-pp) $(FORCE_LINK)
158bdc1a182SJerome Forissier	@echo "old-link-objs := $(link-objs)" >$(link-out-dir)/.tee.elf.cmd
15962428631SJens Wiklander	@$(cmd-echo-silent) '  LD      $@'
1601f09fc53SJerome Forissier	$(q)$(LDcore) $(ldargs-tee.elf) -o $@
1611f09fc53SJerome Forissier
1621f09fc53SJerome Forissierall: $(link-out-dir)/tee.dmp
1631f09fc53SJerome Forissiercleanfiles += $(link-out-dir)/tee.dmp
1641f09fc53SJerome Forissier$(link-out-dir)/tee.dmp: $(link-out-dir)/tee.elf
16562428631SJens Wiklander	@$(cmd-echo-silent) '  OBJDUMP $@'
1661f09fc53SJerome Forissier	$(q)$(OBJDUMPcore) -l -x -d $< > $@
1671f09fc53SJerome Forissier
1681f09fc53SJerome Forissiercleanfiles += $(link-out-dir)/tee-pager.bin
1691a9edabcSJens Wiklander$(link-out-dir)/tee-pager.bin: $(link-out-dir)/tee.elf scripts/gen_tee_bin.py
170b526f8f7SJens Wiklander	@echo Warning: $@ is deprecated
1711a9edabcSJens Wiklander	@$(cmd-echo-silent) '  GEN     $@'
172b4faf480SDick Olsson	$(q)$(PYTHON3) scripts/gen_tee_bin.py --input $< --out_tee_pager_bin $@
1731f09fc53SJerome Forissier
1741f09fc53SJerome Forissiercleanfiles += $(link-out-dir)/tee-pageable.bin
1751a9edabcSJens Wiklander$(link-out-dir)/tee-pageable.bin: $(link-out-dir)/tee.elf scripts/gen_tee_bin.py
176b526f8f7SJens Wiklander	@echo Warning: $@ is deprecated
1772e286522Syanyan-wrs	@$(cmd-echo-silent) '  GEN     $@'
178b4faf480SDick Olsson	$(q)$(PYTHON3) scripts/gen_tee_bin.py --input $< --out_tee_pageable_bin $@
1791f09fc53SJerome Forissier
180c2c16e87SAndrew F. Davisall: $(link-out-dir)/tee.bin
181ac3cc6cfSSummer Qincleanfiles += $(link-out-dir)/tee.bin
1821a9edabcSJens Wiklander$(link-out-dir)/tee.bin: $(link-out-dir)/tee.elf scripts/gen_tee_bin.py
1831a9edabcSJens Wiklander	@$(cmd-echo-silent) '  GEN     $@'
184b4faf480SDick Olsson	$(q)$(PYTHON3) scripts/gen_tee_bin.py --input $< --out_tee_bin $@
185ac3cc6cfSSummer Qin
186ac3cc6cfSSummer Qinall: $(link-out-dir)/tee-header_v2.bin
187ac3cc6cfSSummer Qincleanfiles += $(link-out-dir)/tee-header_v2.bin
1881a9edabcSJens Wiklander$(link-out-dir)/tee-header_v2.bin: $(link-out-dir)/tee.elf \
1891a9edabcSJens Wiklander				   scripts/gen_tee_bin.py
1901a9edabcSJens Wiklander	@$(cmd-echo-silent) '  GEN     $@'
191b4faf480SDick Olsson	$(q)$(PYTHON3) scripts/gen_tee_bin.py --input $< --out_header_v2 $@
192ac3cc6cfSSummer Qin
193ac3cc6cfSSummer Qinall: $(link-out-dir)/tee-pager_v2.bin
194ac3cc6cfSSummer Qincleanfiles += $(link-out-dir)/tee-pager_v2.bin
1951a9edabcSJens Wiklander$(link-out-dir)/tee-pager_v2.bin: $(link-out-dir)/tee.elf scripts/gen_tee_bin.py
1961a9edabcSJens Wiklander	@$(cmd-echo-silent) '  GEN     $@'
197b4faf480SDick Olsson	$(q)$(PYTHON3) scripts/gen_tee_bin.py --input $< --out_pager_v2 $@
198ac3cc6cfSSummer Qin
199ac3cc6cfSSummer Qinall: $(link-out-dir)/tee-pageable_v2.bin
200ac3cc6cfSSummer Qincleanfiles += $(link-out-dir)/tee-pageable_v2.bin
2011a9edabcSJens Wiklander$(link-out-dir)/tee-pageable_v2.bin: $(link-out-dir)/tee.elf \
2021a9edabcSJens Wiklander				     scripts/gen_tee_bin.py
2031a9edabcSJens Wiklander	@$(cmd-echo-silent) '  GEN     $@'
204b4faf480SDick Olsson	$(q)$(PYTHON3) scripts/gen_tee_bin.py --input $< --out_pageable_v2 $@
2051f09fc53SJerome Forissier
2061f09fc53SJerome Forissierall: $(link-out-dir)/tee.symb_sizes
2071f09fc53SJerome Forissiercleanfiles += $(link-out-dir)/tee.symb_sizes
2081f09fc53SJerome Forissier$(link-out-dir)/tee.symb_sizes: $(link-out-dir)/tee.elf
20962428631SJens Wiklander	@$(cmd-echo-silent) '  GEN     $@'
2101f09fc53SJerome Forissier	$(q)$(NMcore) --print-size --reverse-sort --size-sort $< > $@
2111f09fc53SJerome Forissier
2121f09fc53SJerome Forissiercleanfiles += $(link-out-dir)/tee.mem_usage
2131f09fc53SJerome Forissierifneq ($(filter mem_usage,$(MAKECMDGOALS)),)
2141f09fc53SJerome Forissiermem_usage: $(link-out-dir)/tee.mem_usage
2151f09fc53SJerome Forissier
2161f09fc53SJerome Forissier$(link-out-dir)/tee.mem_usage: $(link-out-dir)/tee.elf
21762428631SJens Wiklander	@$(cmd-echo-silent) '  GEN     $@'
218b4faf480SDick Olsson	$(q)$(PYTHON3) ./scripts/mem_usage.py $< > $@
2191f09fc53SJerome Forissierendif
2205ae0290fSLad Prabhakar
221376cb124SJens Wiklanderall: $(link-out-dir)/tee-raw.bin
2225ae0290fSLad Prabhakarcleanfiles += $(link-out-dir)/tee-raw.bin
2235ae0290fSLad Prabhakar$(link-out-dir)/tee-raw.bin: $(link-out-dir)/tee.elf scripts/gen_tee_bin.py
2245ae0290fSLad Prabhakar	@$(cmd-echo-silent) '  GEN     $@'
2255ae0290fSLad Prabhakar	$(q)scripts/gen_tee_bin.py --input $< --out_tee_raw_bin $@
2265ae0290fSLad Prabhakar
2275ae0290fSLad Prabhakarcleanfiles += $(link-out-dir)/tee.srec
2285ae0290fSLad Prabhakar$(link-out-dir)/tee.srec: $(link-out-dir)/tee-raw.bin
2295ae0290fSLad Prabhakar	@$(cmd-echo-silent) '  SREC    $@'
2307b701d1bSVolodymyr Babchuk	$(q)$(OBJCOPYcore) -I binary -O srec $(SRECFLAGS) $< $@
231