mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-23 23:42:32 +00:00
d424134073
The wrapper functions (e.g., 'Unwind_*' and friends) now have the same signature as the original function in 'libgcc', reside in a separate C file which is archived to cxx.lib.a. In supc++.o we prefix the wrapped functions with '_cxx_'. This also enables support for riscv. related to #1880
88 lines
2.9 KiB
Makefile
88 lines
2.9 KiB
Makefile
CXX_SRC_CC += misc.cc new_delete.cc malloc_free.cc exception.cc guard.cc
|
|
# We need the libsupc++ include directory
|
|
STDINC = yes
|
|
|
|
vpath %.cc $(BASE_DIR)/src/base/cxx
|
|
vpath %.c $(BASE_DIR)/src/base/cxx
|
|
|
|
#
|
|
# Here we define all symbols we want to hide in libsupc++ and libgcc_eh
|
|
#
|
|
LIBC_SYMBOLS += malloc free calloc realloc \
|
|
abort fputc fputs fwrite \
|
|
stderr strcat strcpy strlen \
|
|
memcmp strncmp strcmp sprintf \
|
|
__stderrp
|
|
|
|
#
|
|
# Symbols we wrap (see unwind.cc)
|
|
#
|
|
EH_SYMBOLS = _Unwind_Resume _Unwind_Complete _Unwind_DeleteException
|
|
|
|
#
|
|
# Additional functions for ARM
|
|
#
|
|
EH_SYMBOLS += __aeabi_unwind_cpp_pr0 __aeabi_unwind_cpp_pr1
|
|
|
|
#
|
|
# Take the right system libraries
|
|
#
|
|
# Normally, we never include build-system-internal files from library-
|
|
# description files. For building the 'cxx' library, however, we need the
|
|
# information about the used 'gcc' for resolving the location of the C++
|
|
# support libraries. This definition is performed by 'mk/lib.mk' after
|
|
# including this library description file. Hence, we need to manually
|
|
# include 'global.mk' here.
|
|
#
|
|
include $(BASE_DIR)/mk/global.mk
|
|
|
|
LIBCXX_GCC = $(shell $(CUSTOM_CXX_LIB) $(CC_MARCH) -print-file-name=libsupc++.a) \
|
|
$(shell $(CUSTOM_CXX_LIB) $(CC_MARCH) -print-file-name=libgcc_eh.a || true)
|
|
|
|
#
|
|
# Dummy target used by the build system
|
|
#
|
|
SRC_S = supc++.o
|
|
SRC_C = unwind.o
|
|
CXX_SRC = $(sort $(CXX_SRC_CC))
|
|
CXX_OBJECTS = $(addsuffix .o,$(basename $(CXX_SRC)))
|
|
LOCAL_SYMBOLS = $(patsubst %,--localize-symbol=%,$(LIBC_SYMBOLS))
|
|
REDEF_SYMBOLS = $(foreach S, $(EH_SYMBOLS), --redefine-sym $(S)=_cxx_$(S))
|
|
|
|
#
|
|
# Prevent symbols of the gcc support libs from being discarded during 'ld -r'
|
|
#
|
|
KEEP_SYMBOLS += __cxa_guard_acquire
|
|
KEEP_SYMBOLS += __dynamic_cast
|
|
KEEP_SYMBOLS += __cxa_throw_bad_array_new_length
|
|
KEEP_SYMBOLS += __cxa_current_exception_type
|
|
KEEP_SYMBOLS += _ZTVN10__cxxabiv116__enum_type_infoE
|
|
KEEP_SYMBOLS += _ZN10__cxxabiv121__vmi_class_type_infoD0Ev
|
|
KEEP_SYMBOLS += _ZTVN10__cxxabiv119__pointer_type_infoE
|
|
KEEP_SYMBOLS += _ZTSN10__cxxabiv120__function_type_infoE
|
|
|
|
#
|
|
# Include dependency files for the corresponding object files except
|
|
# when cleaning.
|
|
#
|
|
# Normally, the inclusion of dependency files is handled by 'generic.mk'.
|
|
# However, the mechanism in 'generic.mk' considers only the dependencies
|
|
# for the compilation units contained in the 'OBJECTS' variable. For building
|
|
# the cxx library, we rely on the 'CXX_OBJECTS' variable instead. So we need to
|
|
# include the dependenies manually.
|
|
#
|
|
ifneq ($(filter-out $(MAKECMDGOALS),clean),)
|
|
-include $(CXX_OBJECTS:.o=.d)
|
|
endif
|
|
|
|
#
|
|
# Rule to link all libc definitions and libsupc++ libraries
|
|
# and to hide after that the exported libc symbols
|
|
#
|
|
$(SRC_S): $(CXX_OBJECTS)
|
|
$(MSG_MERGE)$@
|
|
$(VERBOSE)$(LD) $(LD_MARCH) $(addprefix -u ,$(KEEP_SYMBOLS)) -r $(CXX_OBJECTS) $(LIBCXX_GCC) -o $@.tmp
|
|
$(MSG_CONVERT)$@
|
|
$(VERBOSE)$(OBJCOPY) $(LOCAL_SYMBOLS) $(REDEF_SYMBOLS) $@.tmp $@
|
|
$(VERBOSE)$(RM) $@.tmp
|