1#
2# Copyright (c) 2020, Google, Inc. All rights reserved
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8#      http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15#
16
17# Build a userspace app.
18#
19# This file must be included at the end of userspace app rules.mk files.
20#
21# args:
22# MODULE : module name (required)
23# TRUSTY_APP_NAME : Simple name of app (without the path to the source
24# 		directory)
25# TRUSTY_APP_BUILDDIR : Build directory for trusty apps (app will be built in
26# 		$(TRUSTY_APP_BUILDDIR)/$(MODULE))
27# TRUSTY_APP_IN_TREE : Boolean indicating if the app is being built in-tree
28# MANIFEST : App manifest JSON file
29# MANIFEST_OVERLAY : Additional manifest overlay JSON file(s)
30# MODULE_CONSTANTS : JSON files with constants used for both the manifest and C
31# 		headers (optional) (CONSTANTS is a deprecated equivalent to
32# 		MODULE_CONSTANTS)
33# TRUSTY_APP_ALLOCATOR : the userspace memory allocator to utilize in the app.
34#		Currently dlmalloc and scudo are supported. If unset, dlmalloc will be
35#		used.
36#
37# The following input arguments control app linking behavior and are not cleared
38# after building the app:
39# TRUSTY_APP_BASE_LDFLAGS : LDFLAGS for the app
40# TRUSTY_APP_ALIGNMENT : Alignment of app image (defaults to 1)
41# TRUSTY_APP_MEMBASE : App base address, if fixed
42# TRUSTY_APP_SYMTAB_ENABLED : If true do not strip symbols from the
43# 		resulting app binary
44#
45#
46# All library.mk input variables are also valid for apps when building in tree,
47# see library.mk for additional args and usage.
48
49ifeq (true,$(call TOBOOL,$(MODULE_ADD_IMPLICIT_DEPS)))
50# Accept explicitly-set scudo or dlmalloc allocators,
51# default to dlmalloc if TRUSTY_APP_ALLOCATOR is empty,
52# error if non-supported allocator is explicitly specified
53ifeq (,$(TRUSTY_APP_ALLOCATOR))
54TRUSTY_APP_ALLOCATOR_FOR_$(MODULE) ?= dlmalloc
55TRUSTY_APP_ALLOCATOR := $(TRUSTY_APP_ALLOCATOR_FOR_$(MODULE))
56endif
57
58ifneq (,$(findstring /scudo/,$(TRUSTY_APP_ALLOCATOR)))
59MODULE_LIBRARY_DEPS := $(MODULE_LIBRARY_DEPS) $(TRUSTY_APP_ALLOCATOR)
60TRUSTY_APP_ALLOCATOR := scudo
61else
62ifeq ($(TRUSTY_APP_ALLOCATOR),$(filter $(TRUSTY_APP_ALLOCATOR),dlmalloc scudo ))
63ifeq (scudo,$(TRUSTY_APP_ALLOCATOR))
64MODULE_LIBRARY_DEPS += \
65    trusty/user/base/lib/scudo
66endif
67ifeq (dlmalloc,$(TRUSTY_APP_ALLOCATOR))
68MODULE_LIBRARY_DEPS += \
69    trusty/user/base/lib/dlmalloc
70endif
71else
72$(error $(TRUSTY_APP_ALLOCATOR) not a supported allocator)
73endif
74endif
75endif
76
77ifeq (true,$(call TOBOOL,$(UNITTEST_COVERAGE_ENABLED)))
78MODULE_LIBRARY_DEPS += trusty/user/base/lib/line-coverage
79endif
80
81MANIFEST_ALLOCATOR := $(subst .json,-$(TRUSTY_APP_ALLOCATOR).json,$(MANIFEST) $(MANIFEST_OVERLAY))
82# append allocator-based manifest to the end, so it overrides base manifest values
83MANIFEST_OVERLAY += $(wildcard $(MANIFEST_ALLOCATOR))
84
85ifeq ($(strip $(TRUSTY_APP_NAME)),)
86TRUSTY_APP_NAME := $(notdir $(MODULE))
87endif
88
89TRUSTY_APP := true
90BUILDDIR := $(TRUSTY_APP_BUILDDIR)/$(MODULE)
91TRUSTY_APP_LOG_NAME := $(MODULE)
92
93TRUSTY_APP_ELF := $(BUILDDIR)/$(TRUSTY_APP_NAME).elf
94
95# Save the path to the output elf file for user-tasks.mk
96_MODULES_$(MODULE)_TRUSTY_APP_ELF := $(TRUSTY_APP_ELF)
97
98ifneq ($(filter-out bin,$(MODULE_RUST_CRATE_TYPES)),)
99$(error $(MODULE) is an app but MODULE_RUST_CRATE_TYPES is not set to "bin")
100endif
101
102MODULE_RUST_CRATE_TYPES := bin
103
104# Only include the rest of the build system if we're building in-tree
105ifeq ($(call TOBOOL,$(TRUSTY_APP_IN_TREE)),true)
106include make/library.mk
107else
108# Generate manifest binary if building with the SDK
109-include $(SDK_DIR)/make/gen_manifest.mk
110all:: $(MODULE_SRCDEPS)
111endif
112
113TRUSTY_APP_LDFLAGS := $(TRUSTY_APP_BASE_LDFLAGS)
114
115ifeq ($(TRUSTY_APP_ALIGNMENT), )
116TRUSTY_APP_ALIGNMENT := 1
117endif
118
119# If ASLR is disabled, don't make PIEs, it burns space
120ifneq ($(ASLR), false)
121    # Generate PIE code to allow ASLR to be applied
122    ifeq ($(call TOBOOL,$(TRUSTY_USERSPACE)),true)
123        TRUSTY_APP_LDFLAGS += -static -pie --no-dynamic-linker -z text -Bsymbolic
124    endif
125endif
126
127TRUSTY_APP_TOOLCHAIN_PREFIX := $(ARCH_$(ARCH)_TOOLCHAIN_PREFIX)
128
129TRUSTY_APP_LD := $(CLANG_BINDIR)/ld.lld
130TRUSTY_APP_OBJCOPY := $(CLANG_BINDIR)/llvm-objcopy
131TRUSTY_APP_OBJDUMP := $(CLANG_BINDIR)/llvm-objdump
132TRUSTY_APP_STRIP := $(CLANG_BINDIR)/llvm-strip
133
134
135# App build rules
136TRUSTY_APP_BIN := $(BUILDDIR)/$(TRUSTY_APP_NAME).bin
137TRUSTY_APP_LST := $(BUILDDIR)/$(TRUSTY_APP_NAME).lst
138TRUSTY_APP_SYMS_ELF := $(BUILDDIR)/$(TRUSTY_APP_NAME).syms.elf
139TRUSTY_APP_OBJS_NO_WHOLE_ARCHIVES := $(filter-out $(MODULE_WHOLE_ARCHIVES),$(ALLMODULE_OBJS))
140TRUSTY_APP_ALL_OBJS := $(TRUSTY_APP_OBJS_NO_WHOLE_ARCHIVES) $(MODULE_EXTRA_OBJECTS)
141
142# Link app elf
143ifeq ($(call TOBOOL,$(MODULE_IS_RUST)),true)
144MODULE_RUSTFLAGS += \
145	-Z pre-link-args="$(filter-out %.rlib %.so,$(MODULE_EXTRA_OBJECTS))" \
146	-C link-args="$(filter-out %.rlib %.so,$(TRUSTY_APP_OBJS_NO_WHOLE_ARCHIVES)) $(TRUSTY_APP_LIBGCC)" \
147	-C link-args="--push-state --whole-archive $(filter-out %.rlib %.so,$(MODULE_WHOLE_ARCHIVES)) --pop-state" \
148	-C link-args="$(TRUSTY_APP_LDFLAGS) $(MODULE_LDFLAGS)" \
149
150$(TRUSTY_APP_SYMS_ELF).d:
151
152$(TRUSTY_APP_SYMS_ELF): GLOBAL_RUSTFLAGS := $(GLOBAL_SHARED_RUSTFLAGS) $(GLOBAL_USER_RUSTFLAGS)
153$(TRUSTY_APP_SYMS_ELF): ARCH_RUSTFLAGS := $(ARCH_$(ARCH)_RUSTFLAGS)
154$(TRUSTY_APP_SYMS_ELF): TRUSTY_APP_LOG_NAME := $(TRUSTY_APP_LOG_NAME)
155$(TRUSTY_APP_SYMS_ELF): MODULE_RUSTFLAGS := $(MODULE_RUSTFLAGS) --crate-type=bin
156$(TRUSTY_APP_SYMS_ELF): MODULE_RUST_ENV := $(MODULE_RUST_ENV)
157$(TRUSTY_APP_SYMS_ELF): MODULE_SDK_LIBS := $(MODULE_SDK_LIBS)
158$(TRUSTY_APP_SYMS_ELF): $(TRUSTY_APP_RUST_MAIN_SRC) $(TRUSTY_APP_RUST_SRCDEPS) $(TRUSTY_APP_ALL_OBJS) $(MODULE_SDK_LIBS) $(TRUSTY_APP_SYMS_ELF).d
159	@$(MKDIR)
160	@$(call ECHO,$(TRUSTY_APP_LOG_NAME),compiling,$<)
161ifeq ($(call TOBOOL,$(MODULE_RUST_USE_CLIPPY)),true)
162	$(NOECHO) set -e ; \
163		TEMP_CLIPPY_DIR=$$(mktemp -d) ;\
164		mkdir -p $(dir $$TEMP_CLIPPY_DIR/$@) ;\
165		$(MODULE_RUST_ENV) $(CLIPPY_DRIVER) $(GLOBAL_RUSTFLAGS) $(ARCH_RUSTFLAGS) $(MODULE_RUSTFLAGS) $< -o $$TEMP_CLIPPY_DIR/$@ ;\
166		rm -rf $$TEMP_CLIPPY_DIR
167endif
168	$(NOECHO)$(MODULE_RUST_ENV) $(RUSTC) $(GLOBAL_RUSTFLAGS) $(ARCH_RUSTFLAGS) $(MODULE_RUSTFLAGS) $< --emit "dep-info=$@.d" -o $@
169	@$(call ECHO_DONE_SILENT,$(TRUSTY_APP_LOG_NAME),compiling,$<)
170
171-include $(TRUSTY_APP_SYMS_ELF).d
172
173else
174
175$(TRUSTY_APP_SYMS_ELF): TRUSTY_APP_LD := $(TRUSTY_APP_LD)
176$(TRUSTY_APP_SYMS_ELF): TRUSTY_APP_LIBGCC := $(TRUSTY_APP_LIBGCC)
177$(TRUSTY_APP_SYMS_ELF): TRUSTY_APP_LIBCOV := $(TRUSTY_APP_LIBCOV)
178$(TRUSTY_APP_SYMS_ELF): TRUSTY_APP_LDFLAGS := $(TRUSTY_APP_LDFLAGS)
179$(TRUSTY_APP_SYMS_ELF): TRUSTY_APP_MEMBASE := $(TRUSTY_APP_MEMBASE)
180$(TRUSTY_APP_SYMS_ELF): TRUSTY_APP_ALL_OBJS := $(TRUSTY_APP_ALL_OBJS)
181$(TRUSTY_APP_SYMS_ELF): TRUSTY_APP_LOG_NAME := $(TRUSTY_APP_LOG_NAME)
182$(TRUSTY_APP_SYMS_ELF): MODULE_LDFLAGS := $(MODULE_LDFLAGS)
183$(TRUSTY_APP_SYMS_ELF): MODULE_WHOLE_ARCHIVES := $(MODULE_WHOLE_ARCHIVES)
184$(TRUSTY_APP_SYMS_ELF): MODULE_SDK_LIBS := $(MODULE_SDK_LIBS)
185$(TRUSTY_APP_SYMS_ELF): $(TRUSTY_APP_ALL_OBJS) $(MODULE_WHOLE_ARCHIVES) $(MODULE_SDK_LIBS)
186	@$(MKDIR)
187	@$(call ECHO,$(TRUSTY_APP_LOG_NAME),linking,$@)
188	$(NOECHO)$(TRUSTY_APP_LD) $(TRUSTY_APP_LDFLAGS) $(MODULE_LDFLAGS) $(addprefix -Ttext ,$(TRUSTY_APP_MEMBASE)) --start-group $(TRUSTY_APP_ALL_OBJS) $(TRUSTY_APP_LIBGCC) $(TRUSTY_APP_LIBCOV) --whole-archive $(MODULE_WHOLE_ARCHIVES) --end-group -o $@
189	@$(call ECHO_DONE_SILENT,$(TRUSTY_APP_LOG_NAME),linking,$@)
190endif
191
192ifeq ($(call TOBOOL,$(TRUSTY_APP_SYMTAB_ENABLED)),true)
193TRUSTY_APP_STRIPFLAGS := --strip-debug
194else
195TRUSTY_APP_STRIPFLAGS := -s
196endif
197
198ifeq (true,$(call TOBOOL,$(UNITTEST_COVERAGE_ENABLED)))
199TRUSTY_APP_STRIPFLAGS += \
200    --remove-section=__llvm_covfun \
201    --remove-section=__llvm_covmap
202endif
203
204# And strip it and pad with zeros to be page aligned
205$(TRUSTY_APP_ELF): TRUSTY_APP_STRIP := $(TRUSTY_APP_STRIP)
206$(TRUSTY_APP_ELF): TRUSTY_APP_ALIGNMENT := $(TRUSTY_APP_ALIGNMENT)
207$(TRUSTY_APP_ELF): TRUSTY_APP_STRIPFLAGS := $(TRUSTY_APP_STRIPFLAGS)
208$(TRUSTY_APP_ELF): TRUSTY_APP_LOG_NAME := $(TRUSTY_APP_LOG_NAME)
209$(TRUSTY_APP_ELF): $(TRUSTY_APP_SYMS_ELF)
210	@$(MKDIR)
211	@$(call ECHO,$(TRUSTY_APP_LOG_NAME),stripping and page aligning,$<)
212	$(NOECHO)$(TRUSTY_APP_STRIP) $(TRUSTY_APP_STRIPFLAGS) $< -o $@
213	$(NOECHO)truncate -s %$(TRUSTY_APP_ALIGNMENT) $@
214	@$(call ECHO_DONE_SILENT,$(TRUSTY_APP_LOG_NAME),stripping and page aligning,$<)
215
216# build app binary
217$(TRUSTY_APP_BIN): TRUSTY_APP_OBJCOPY := $(TRUSTY_APP_OBJCOPY)
218$(TRUSTY_APP_BIN): TRUSTY_APP_LOG_NAME := $(TRUSTY_APP_LOG_NAME)
219$(TRUSTY_APP_BIN): $(TRUSTY_APP_ELF)
220	@$(call ECHO,$(TRUSTY_APP_LOG_NAME),generating image,$@)
221	$(NOECHO)$(TRUSTY_APP_OBJCOPY) -O binary $< $@
222	@$(call ECHO_DONE_SILENT,$(TRUSTY_APP_LOG_NAME),generating image,$@)
223
224# Generate listing file for the app
225$(TRUSTY_APP_LST): TRUSTY_APP_OBJDUMP := $(TRUSTY_APP_OBJDUMP)
226$(TRUSTY_APP_LST): TRUSTY_APP_LOG_NAME := $(TRUSTY_APP_LOG_NAME)
227$(TRUSTY_APP_LST): $(TRUSTY_APP_SYMS_ELF)
228	@$(call ECHO,$(TRUSTY_APP_LOG_NAME),generating lst,$@)
229	$(NOECHO)$(TRUSTY_APP_OBJDUMP) -dS $< > $@ 2> /dev/null
230	@$(call ECHO_DONE_SILENT,$(TRUSTY_APP_LOG_NAME),generating lst,$@)
231
232
233# Also generate listings
234all:: $(TRUSTY_APP_BIN) $(TRUSTY_APP_MANIFEST_BIN) $(TRUSTY_APP_ELF) $(TRUSTY_APP_LST)
235
236# Reset local variables
237TRUSTY_APP :=
238TRUSTY_APP_NAME :=
239TRUSTY_APP_ALLOCATOR :=
240
241TRUSTY_APP_BIN :=
242TRUSTY_APP_ELF :=
243TRUSTY_APP_LST :=
244TRUSTY_APP_SYMS_ELF :=
245TRUSTY_APP_OBJS_NO_WHOLE_ARCHIVES :=
246TRUSTY_APP_ALL_OBJS :=
247TRUSTY_APP_CONFIGHEADER :=
248
249TRUSTY_APP_TOOLCHAIN_PREFIX :=
250TRUSTY_APP_CC :=
251TRUSTY_APP_LD :=
252TRUSTY_APP_LDFLAGS :=
253TRUSTY_APP_OBJCOPY :=
254TRUSTY_APP_OBJDUMP :=
255TRUSTY_APP_STRIP :=
256TRUSTY_APP_STRIPFLAGS :=
257TRUSTY_APP_RUST_MAIN_SRC :=
258TRUSTY_APP_RUST_SRCDEPS :=
259
260TRUSTY_APP_APP :=
261
262TRUSTY_APP_MANIFEST_BIN :=
263TRUSTY_APP_DISABLE_SCS :=
264
265ALLMODULE_OBJS :=
266
267MODULE_CONSTANTS :=
268MODULE_LDFLAGS :=
269MODULE_WHOLE_ARCHIVES :=
270MODULE_RUSTFLAGS :=
271MODULE_RUST_ENV :=
272MODULE_SDK_LIBS :=
273
274MANIFEST_COMPILER :=
275