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