xref: /optee_os/ta/link.mk (revision 31b31015b854f6688ce8ea71aed055a1e7f493e1)
1*31b31015Sliushiweilink-script$(sm) = $(ta-dev-kit-dir$(sm))/src/ta.ld.S
2*31b31015Sliushiweilink-script-pp$(sm) = $(link-out-dir$(sm))/ta.lds
3*31b31015Sliushiweilink-script-dep$(sm) = $(link-out-dir$(sm))/.ta.ld.d
4*31b31015Sliushiwei
5*31b31015SliushiweiSIGN_ENC ?= $(PYTHON3) $(ta-dev-kit-dir$(sm))/scripts/sign_encrypt.py
6*31b31015SliushiweiTA_SIGN_KEY ?= $(ta-dev-kit-dir$(sm))/keys/default_ta.pem
7*31b31015Sliushiwei
8*31b31015Sliushiweiifeq ($(CFG_ENCRYPT_TA),y)
9*31b31015Sliushiwei# Default TA encryption key is a dummy key derived from default
10*31b31015Sliushiwei# hardware unique key (an array of 16 zero bytes) to demonstrate
11*31b31015Sliushiwei# usage of REE-FS TAs encryption feature.
12*31b31015Sliushiwei#
13*31b31015Sliushiwei# Note that a user of this TA encryption feature needs to provide
14*31b31015Sliushiwei# encryption key and its handling corresponding to their security
15*31b31015Sliushiwei# requirements.
16*31b31015SliushiweiTA_ENC_KEY ?= 'b64d239b1f3c7d3b06506229cd8ff7c8af2bb4db2168621ac62c84948468c4f4'
17*31b31015Sliushiweiendif
18*31b31015Sliushiwei
19*31b31015Sliushiweiall: $(link-out-dir$(sm))/$(user-ta-uuid).dmp \
20*31b31015Sliushiwei	$(link-out-dir$(sm))/$(user-ta-uuid).stripped.elf \
21*31b31015Sliushiwei	$(link-out-dir$(sm))/$(user-ta-uuid).ta
22*31b31015Sliushiweicleanfiles += $(link-out-dir$(sm))/$(user-ta-uuid).elf
23*31b31015Sliushiweicleanfiles += $(link-out-dir$(sm))/$(user-ta-uuid).dmp
24*31b31015Sliushiweicleanfiles += $(link-out-dir$(sm))/$(user-ta-uuid).map
25*31b31015Sliushiweicleanfiles += $(link-out-dir$(sm))/$(user-ta-uuid).stripped.elf
26*31b31015Sliushiweicleanfiles += $(link-out-dir$(sm))/$(user-ta-uuid).ta
27*31b31015Sliushiweicleanfiles += $(link-script-pp$(sm)) $(link-script-dep$(sm))
28*31b31015Sliushiwei
29*31b31015Sliushiweilink-ldflags  = -e__ta_entry -pie
30*31b31015Sliushiweilink-ldflags += -T $(link-script-pp$(sm))
31*31b31015Sliushiweilink-ldflags += -Map=$(link-out-dir$(sm))/$(user-ta-uuid).map
32*31b31015Sliushiweilink-ldflags += --sort-section=alignment
33*31b31015Sliushiweilink-ldflags += -z max-page-size=4096 # OP-TEE always uses 4K alignment
34*31b31015Sliushiweiifeq ($(sm)-$(CFG_TA_BTI),ta_arm64-y)
35*31b31015Sliushiweilink-ldflags += $(call ld-option,-z force-bti) --fatal-warnings
36*31b31015Sliushiweiendif
37*31b31015Sliushiweilink-ldflags += --as-needed # Do not add dependency on unused shlib
38*31b31015Sliushiweilink-ldflags += $(link-ldflags$(sm))
39*31b31015Sliushiwei
40*31b31015Sliushiwei$(link-out-dir$(sm))/dyn_list:
41*31b31015Sliushiwei	@$(cmd-echo-silent) '  GEN     $@'
42*31b31015Sliushiwei	$(q)mkdir -p $(dir $@)
43*31b31015Sliushiwei	$(q)echo "{" >$@
44*31b31015Sliushiwei	$(q)echo "__elf_phdr_info;" >>$@
45*31b31015Sliushiweiifeq ($(CFG_FTRACE_SUPPORT),y)
46*31b31015Sliushiwei	$(q)echo "__ftrace_info;" >>$@
47*31b31015Sliushiweiendif
48*31b31015Sliushiwei	$(q)echo "trace_ext_prefix;" >>$@
49*31b31015Sliushiwei	$(q)echo "trace_level;" >>$@
50*31b31015Sliushiwei	$(q)echo "};" >>$@
51*31b31015Sliushiweilink-ldflags += --dynamic-list $(link-out-dir$(sm))/dyn_list
52*31b31015Sliushiweidynlistdep = $(link-out-dir$(sm))/dyn_list
53*31b31015Sliushiweicleanfiles += $(link-out-dir$(sm))/dyn_list
54*31b31015Sliushiwei
55*31b31015Sliushiweilink-ldadd  = $(user-ta-ldadd) $(addprefix -L,$(libdirs))
56*31b31015Sliushiweilink-ldadd += --start-group
57*31b31015Sliushiweilink-ldadd += $(addprefix -l,$(libnames))
58*31b31015Sliushiweiifneq (,$(filter %.cpp,$(srcs)))
59*31b31015Sliushiweilink-ldflags += --eh-frame-hdr
60*31b31015Sliushiweilink-ldadd += $(libstdc++$(sm)) $(libgcc_eh$(sm))
61*31b31015Sliushiweiendif
62*31b31015Sliushiweilink-ldadd += --end-group
63*31b31015Sliushiwei
64*31b31015Sliushiweilink-ldadd-after-libgcc += $(addprefix -l,$(libnames-after-libgcc))
65*31b31015Sliushiwei
66*31b31015Sliushiweildargs-$(user-ta-uuid).elf := $(link-ldflags) $(objs) $(link-ldadd) \
67*31b31015Sliushiwei				$(libgcc$(sm)) $(link-ldadd-after-libgcc)
68*31b31015Sliushiwei
69*31b31015Sliushiweilink-script-cppflags-$(sm) := \
70*31b31015Sliushiwei	$(filter-out $(CPPFLAGS_REMOVE) $(cppflags-remove), \
71*31b31015Sliushiwei		$(nostdinc$(sm)) $(CPPFLAGS) \
72*31b31015Sliushiwei		$(addprefix -I,$(incdirs$(sm)) $(link-out-dir$(sm))) \
73*31b31015Sliushiwei		$(cppflags$(sm)))
74*31b31015Sliushiwei
75*31b31015Sliushiwei-include $(link-script-dep$(sm))
76*31b31015Sliushiwei
77*31b31015Sliushiweilink-script-pp-makefiles$(sm) = $(filter-out %.d %.cmd,$(MAKEFILE_LIST))
78*31b31015Sliushiwei
79*31b31015Sliushiweidefine gen-link-t
80*31b31015Sliushiwei$(link-script-pp$(sm)): $(link-script$(sm)) $(conf-file) $(link-script-pp-makefiles$(sm))
81*31b31015Sliushiwei	@$(cmd-echo-silent) '  CPP     $$@'
82*31b31015Sliushiwei	$(q)mkdir -p $$(dir $$@)
83*31b31015Sliushiwei	$(q)$(CPP$(sm)) -P -MT $$@ -MD -MF $(link-script-dep$(sm)) \
84*31b31015Sliushiwei		$(link-script-cppflags-$(sm)) $$< -o $$@
85*31b31015Sliushiwei
86*31b31015Sliushiwei$(link-out-dir$(sm))/$(user-ta-uuid).elf: $(objs) $(libdeps) \
87*31b31015Sliushiwei					  $(libdeps-after-libgcc) \
88*31b31015Sliushiwei					  $(link-script-pp$(sm)) \
89*31b31015Sliushiwei					  $(dynlistdep) \
90*31b31015Sliushiwei					  $(additional-link-deps)
91*31b31015Sliushiwei	@$(cmd-echo-silent) '  LD      $$@'
92*31b31015Sliushiwei	$(q)$(LD$(sm)) $(ldargs-$(user-ta-uuid).elf) -o $$@
93*31b31015Sliushiwei
94*31b31015Sliushiwei$(link-out-dir$(sm))/$(user-ta-uuid).dmp: \
95*31b31015Sliushiwei			$(link-out-dir$(sm))/$(user-ta-uuid).elf
96*31b31015Sliushiwei	@$(cmd-echo-silent) '  OBJDUMP $$@'
97*31b31015Sliushiwei	$(q)$(OBJDUMP$(sm)) -l -x -d $$< > $$@
98*31b31015Sliushiwei
99*31b31015Sliushiwei$(link-out-dir$(sm))/$(user-ta-uuid).stripped.elf: \
100*31b31015Sliushiwei			$(link-out-dir$(sm))/$(user-ta-uuid).elf
101*31b31015Sliushiwei	@$(cmd-echo-silent) '  OBJCOPY $$@'
102*31b31015Sliushiwei	$(q)$(OBJCOPY$(sm)) --strip-unneeded $$< $$@
103*31b31015Sliushiwei
104*31b31015Sliushiweicmd-echo$(user-ta-uuid) := SIGN   #
105*31b31015Sliushiweiifeq ($(CFG_ENCRYPT_TA),y)
106*31b31015Sliushiweicrypt-args$(user-ta-uuid) := --enc-key $(TA_ENC_KEY)
107*31b31015Sliushiweicmd-echo$(user-ta-uuid) := SIGNENC
108*31b31015Sliushiweiendif
109*31b31015Sliushiwei$(link-out-dir$(sm))/$(user-ta-uuid).ta: \
110*31b31015Sliushiwei			$(link-out-dir$(sm))/$(user-ta-uuid).stripped.elf \
111*31b31015Sliushiwei			$(TA_SIGN_KEY) $(TA_SUBKEY_DEPS) \
112*31b31015Sliushiwei			$(lastword $(SIGN_ENC))
113*31b31015Sliushiwei	@$(cmd-echo-silent) '  $$(cmd-echo$(user-ta-uuid)) $$@'
114*31b31015Sliushiwei	$(q)$(SIGN_ENC) --key $(TA_SIGN_KEY) $(TA_SUBKEY_ARGS) \
115*31b31015Sliushiwei		$$(crypt-args$(user-ta-uuid)) \
116*31b31015Sliushiwei		--uuid $(user-ta-uuid) --ta-version $(user-ta-version) \
117*31b31015Sliushiwei		--in $$< --out $$@
118*31b31015Sliushiweiendef
119*31b31015Sliushiwei
120*31b31015Sliushiwei$(eval $(call gen-link-t))
121*31b31015Sliushiwei
122*31b31015Sliushiweiadditional-link-deps :=
123