mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-15 17:14:21 +00:00

The problem that this resolves is a bit involved; the following must be met at the same time for some function <to_be_wrapped>: * to_be_wrapped must be specified as part of the romlib * to_be_wrapped must _not_ be referenced by any translation unit in TF-A * to_be_wrapped must be referenced by a translation unit in a dependent library, mbedtls for example. Under these circumstances, to_be_wrapped will not be wrapped, and will instead reference its original definition while simultaneously residing in romlib. This is a side effect of two issues with romlib prior to this patch: 1 to_be_wrapped is expected to wrap by duplicating its definition. This causes any condition that links against both the base and wrapper functions to be a link error (duplicate symbol definition). 2 to_be_wrapped is in its own translation unit This causes the wrappers to be used by TF-A in an as needed. The duplicate function definitions can be worked around using the linker's `--wrap` flag, which redirects all references to a symbol to resolve to `__wrap_<symbol>` and the original symbol to be available as `__real_<symbol>`. Most of the changes handle creating this arguments and passing them to the linker. Further, once you use the linker's wrap, you will encounter another issue: if TF-A does not use a function, its wrapper is not present. This causes link issues when a library and not TF-A uses the wrapper. Note that this issue would have been resolved previously by ignoring the wrapper and using the base definition. This further issue is worked around by concatenating the assembly for all of the wrappers into a single translation unit. It's possible to work around this issue in a few other ways, including reordering the libraries passed to the linker to place libwrapper.a last or grouping the libraries so that symbols from later libraries may be resolved with prior libraries. I chose the translation unit concatenation approach as it revealed that a jumptable has duplicate symbols within it. Change-Id: Ie57b5ae69bde2fc8705bdc7a93fae3ddb5341ed9 Signed-off-by: Jimmy Brisson <jimmy.brisson@arm.com>
99 lines
2.8 KiB
Makefile
99 lines
2.8 KiB
Makefile
#
|
|
# Copyright (c) 2018-2024, Arm Limited and Contributors. All rights reserved.
|
|
#
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
#
|
|
|
|
ifeq ($(filter-out clean,$(or $(MAKECMDGOALS),all)),)
|
|
toolchains :=
|
|
else
|
|
toolchains := aarch64
|
|
endif
|
|
|
|
include ../../make_helpers/common.mk
|
|
include ../../make_helpers/toolchain.mk
|
|
|
|
ROMLIB_GEN = ./romlib_generator.py
|
|
BUILD_DIR = $(BUILD_PLAT)/romlib
|
|
LIB_DIR = $(BUILD_PLAT)/lib
|
|
WRAPPER_DIR = $(BUILD_PLAT)/libwrapper
|
|
LIBS = -lmbedtls -lfdt -lc
|
|
INC = $(INCLUDES:-I%=-I../../%)
|
|
PPFLAGS = $(INC) $(DEFINES) -P -x assembler-with-cpp -D__LINKER__ -MD -MP -MT $(BUILD_DIR)/romlib.ld
|
|
OBJS = $(BUILD_DIR)/jmptbl.o $(BUILD_DIR)/init.o
|
|
MAPFILE = $(BUILD_PLAT)/romlib/romlib.map
|
|
|
|
ifneq ($(PLAT_DIR),)
|
|
WRAPPER_SOURCES = $(sort $(shell $(ROMLIB_GEN) genwrappers -b $\
|
|
$(WRAPPER_DIR) --list ../../$(PLAT_DIR)/jmptbl.i))
|
|
|
|
WRAPPER_OBJS = $(WRAPPER_SOURCES:.s=.o)
|
|
endif
|
|
|
|
LDFLAGS := -Wl,--gc-sections -nostdlib
|
|
|
|
ifeq ($(DEBUG),1)
|
|
LDFLAGS += -Wl,-Map=$(MAPFILE)
|
|
endif
|
|
|
|
ifeq (${ARM_ARCH_MINOR},0)
|
|
ASFLAGS = -march=armv8-a
|
|
else
|
|
ASFLAGS = -march=armv8.${ARM_ARCH_MINOR}-a
|
|
endif
|
|
|
|
.PHONY: all clean distclean
|
|
|
|
all: $(BUILD_DIR)/romlib.bin $(BUILD_DIR)/romlib.ldflags $(LIB_DIR)/libwrappers.a
|
|
|
|
%.o: %.s
|
|
$(s)echo " AS $@"
|
|
$(q)$(aarch64-as) -c $(ASFLAGS) -o $@ $<
|
|
|
|
$(BUILD_DIR)/%.o: %.s
|
|
$(s)echo " AS $@"
|
|
$(q)$(aarch64-as) -c $(ASFLAGS) -o $@ $<
|
|
|
|
$(BUILD_DIR)/romlib.ld: romlib.ld.S
|
|
$(s)echo " PP $@"
|
|
$(q)$(aarch64-cpp) -E $(PPFLAGS) -o $@ romlib.ld.S
|
|
|
|
$(BUILD_DIR)/romlib.elf: $(OBJS) $(BUILD_DIR)/romlib.ld
|
|
$(s)echo " LD $@"
|
|
$(q)$(aarch64-ld) -T $(BUILD_DIR)/romlib.ld -L$(LIB_DIR) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
|
|
|
|
$(BUILD_DIR)/romlib.bin: $(BUILD_DIR)/romlib.elf
|
|
$(s)echo " BIN $@"
|
|
$(q)$(aarch64-oc) -O binary $(BUILD_DIR)/romlib.elf $@
|
|
|
|
$(WRAPPER_DIR)/jmpvar.s: $(BUILD_DIR)/romlib.elf
|
|
$(s)echo " VAR $@"
|
|
$(q)$(ROMLIB_GEN) genvar --output $@ $<
|
|
|
|
$(LIB_DIR)/libwrappers.a: $(WRAPPER_DIR)/jmpvar.o $(WRAPPER_OBJS)
|
|
$(s)echo " AR $@"
|
|
$(q)$(aarch64-ar) -rc $@ $(WRAPPER_DIR)/jmpvar.o $(WRAPPER_OBJS)
|
|
|
|
$(BUILD_DIR)/jmptbl.i: ../../$(PLAT_DIR)/jmptbl.i
|
|
$(s)echo " PRE $@"
|
|
$(q)$(ROMLIB_GEN) pre --output $@ --deps $(BUILD_DIR)/jmptbl.d $<
|
|
|
|
$(WRAPPER_SOURCES) &: $(BUILD_DIR)/jmptbl.i
|
|
$(s)echo " WRP $<"
|
|
$(q)$(ROMLIB_GEN) genwrappers --bti=$(ENABLE_BTI) -b $(WRAPPER_DIR) $<
|
|
|
|
$(WRAPPER_OBJS): $(WRAPPER_DIR)/%.o: $(WRAPPER_DIR)/%.s
|
|
|
|
$(BUILD_DIR)/jmptbl.s: $(BUILD_DIR)/jmptbl.i
|
|
$(s)echo " TBL $@"
|
|
$(q)$(ROMLIB_GEN) gentbl --output $@ --bti=$(ENABLE_BTI) $<
|
|
|
|
$(BUILD_DIR)/romlib.ldflags: ../../$(PLAT_DIR)/jmptbl.i
|
|
$(s)echo " LDFLAGS $@"
|
|
$(q)$(ROMLIB_GEN) link-flags $< > $@
|
|
|
|
clean:
|
|
$(q)rm -f $(BUILD_DIR)/*
|
|
|
|
-include $(BUILD_DIR)/romlib.d
|
|
-include $(BUILD_DIR)/jmptbl.d
|