mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-11 23:47:24 +00:00
1e578ed20c
Add CONFIG_ASAN to build with the Address Sanitizer. This only works with the sandbox so the config is likewise dependent. The resulting executable will have ASAN instrumentation, including the leak detector that can be disabled with the ASAN_OPTIONS environment variable: ASAN_OPTIONS=detect_leaks=0 ./u-boot Since u-boot uses its own dlmalloc, dynamic allocations aren't automatically instrumented, but stack variables and globals are. Instrumentation could be added to dlmalloc to poison and unpoison memory as it is allocated and deallocated, and to introduce redzones between allocations. Alternatively, the sandbox may be able to play games with the system allocator and somehow still keep the required memory abstraction. No effort to address dynamic allocation is made by this patch. The config is not yet enabled for any targets by default. Signed-off-by: Andrew Scull <ascull@google.com> Reviewed-by: Simon Glass <sjg@chromium.org>
74 lines
2.6 KiB
Makefile
74 lines
2.6 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0+
|
|
# Copyright (c) 2011 The Chromium OS Authors.
|
|
|
|
PLATFORM_CPPFLAGS += -D__SANDBOX__ -U_FORTIFY_SOURCE
|
|
PLATFORM_CPPFLAGS += -fPIC
|
|
PLATFORM_LIBS += -lrt
|
|
SDL_CONFIG ?= sdl2-config
|
|
|
|
# Define this to avoid linking with SDL, which requires SDL libraries
|
|
# This can solve 'sdl-config: Command not found' errors
|
|
ifneq ($(NO_SDL),)
|
|
PLATFORM_CPPFLAGS += -DSANDBOX_NO_SDL
|
|
else
|
|
PLATFORM_LIBS += $(shell $(SDL_CONFIG) --libs)
|
|
PLATFORM_CPPFLAGS += $(shell $(SDL_CONFIG) --cflags)
|
|
endif
|
|
|
|
SANITIZERS :=
|
|
ifdef CONFIG_ASAN
|
|
SANITIZERS += -fsanitize=address
|
|
endif
|
|
KBUILD_CFLAGS += $(SANITIZERS)
|
|
|
|
cmd_u-boot__ = $(CC) -o $@ -Wl,-T u-boot.lds $(u-boot-init) \
|
|
$(KBUILD_LDFLAGS:%=-Wl,%) \
|
|
$(SANITIZERS) \
|
|
$(LTO_FINAL_LDFLAGS) \
|
|
-Wl,--whole-archive \
|
|
$(u-boot-main) \
|
|
$(u-boot-keep-syms-lto) \
|
|
-Wl,--no-whole-archive \
|
|
$(PLATFORM_LIBS) -Wl,-Map -Wl,u-boot.map
|
|
|
|
cmd_u-boot-spl = (cd $(obj) && $(CC) -o $(SPL_BIN) -Wl,-T u-boot-spl.lds \
|
|
$(KBUILD_LDFLAGS:%=-Wl,%) \
|
|
$(SANITIZERS) \
|
|
$(LTO_FINAL_LDFLAGS) \
|
|
$(patsubst $(obj)/%,%,$(u-boot-spl-init)) \
|
|
-Wl,--whole-archive \
|
|
$(patsubst $(obj)/%,%,$(u-boot-spl-main)) \
|
|
$(patsubst $(obj)/%,%,$(u-boot-spl-platdata)) \
|
|
$(patsubst $(obj)/%,%,$(u-boot-spl-keep-syms-lto)) \
|
|
-Wl,--no-whole-archive \
|
|
$(PLATFORM_LIBS) -Wl,-Map -Wl,u-boot-spl.map -Wl,--gc-sections)
|
|
|
|
CONFIG_ARCH_DEVICE_TREE := sandbox
|
|
|
|
ifeq ($(HOST_ARCH),$(HOST_ARCH_X86_64))
|
|
EFI_LDS := ${SRCDIR}/../../../arch/x86/lib/elf_x86_64_efi.lds
|
|
EFI_TARGET := --target=efi-app-x86_64
|
|
else ifeq ($(HOST_ARCH),$(HOST_ARCH_X86))
|
|
EFI_LDS := ${SRCDIR}/../../../arch/x86/lib/elf_ia32_efi.lds
|
|
EFI_TARGET := --target=efi-app-ia32
|
|
else ifeq ($(HOST_ARCH),$(HOST_ARCH_AARCH64))
|
|
EFI_LDS := ${SRCDIR}/../../../arch/arm/lib/elf_aarch64_efi.lds
|
|
OBJCOPYFLAGS += -j .text -j .secure_text -j .secure_data -j .rodata -j .data \
|
|
-j __u_boot_list -j .rela.dyn -j .got -j .got.plt \
|
|
-j .binman_sym_table -j .text_rest \
|
|
-j .efi_runtime -j .efi_runtime_rel
|
|
else ifeq ($(HOST_ARCH),$(HOST_ARCH_ARM))
|
|
EFI_LDS := ${SRCDIR}/../../../arch/arm/lib/elf_arm_efi.lds
|
|
OBJCOPYFLAGS += -j .text -j .secure_text -j .secure_data -j .rodata -j .hash \
|
|
-j .data -j .got -j .got.plt -j __u_boot_list -j .rel.dyn \
|
|
-j .binman_sym_table -j .text_rest \
|
|
-j .efi_runtime -j .efi_runtime_rel
|
|
else ifeq ($(HOST_ARCH),$(HOST_ARCH_RISCV32))
|
|
EFI_LDS := ${SRCDIR}/../../../arch/riscv/lib/elf_riscv32_efi.lds
|
|
else ifeq ($(HOST_ARCH),$(HOST_ARCH_RISCV64))
|
|
EFI_LDS := ${SRCDIR}/../../../arch/riscv/lib/elf_riscv64_efi.lds
|
|
endif
|
|
EFI_CRT0 := crt0_sandbox_efi.o
|
|
EFI_RELOC := reloc_sandbox_efi.o
|
|
AFLAGS_crt0_sandbox_efi.o += -DHOST_ARCH="$(HOST_ARCH)"
|
|
CFLAGS_reloc_sandbox_efi.o += -DHOST_ARCH="$(HOST_ARCH)"
|