genode/repos/base/src/lib/cxx/Tupfile

128 lines
3.2 KiB
Plaintext

include_rules
COMMON_FLAGS = -ffunction-sections -fno-strict-aliasing
CFLAGS += $(COMMON_FLAGS)
CXXFLAGS += $(COMMON_FLAGS)
#
# Prevent symbols of the gcc support libs from being discarded during 'ld -r'
#
KEEP_SYMBOLS = \
-u __cxa_guard_acquire \
-u __dynamic_cast \
-u __cxa_throw_bad_array_new_length \
-u __cxa_current_exception_type \
-u _ZTVN10__cxxabiv116__enum_type_infoE \
-u _ZN10__cxxabiv121__vmi_class_type_infoD0Ev \
-u _ZTVN10__cxxabiv119__pointer_type_infoE \
-u _ZTSN10__cxxabiv120__function_type_infoE \
# Here we define all symbols we want to hide in libsupc++ and libgcc_eh
#
LOCAL_SYMBOLS = \
--localize-symbol=__stderrp
--localize-symbol=abort \
--localize-symbol=calloc \
--localize-symbol=fflush \
--localize-symbol=fprintf \
--localize-symbol=fputc \
--localize-symbol=fputs \
--localize-symbol=free \
--localize-symbol=fwrite \
--localize-symbol=islower \
--localize-symbol=isxdigit \
--localize-symbol=malloc \
--localize-symbol=memcmp \
--localize-symbol=memcpy \
--localize-symbol=memmove \
--localize-symbol=memset \
--localize-symbol=posix_memalign \
--localize-symbol=realloc \
--localize-symbol=snprintf \
--localize-symbol=sprintf \
--localize-symbol=stderr \
--localize-symbol=strcat \
--localize-symbol=strcmp \
--localize-symbol=strcpy \
--localize-symbol=strlen \
--localize-symbol=strncmp \
--localize-symbol=vfprintf \
#
# Symbols we wrap (see unwind.c)
#
EH_SYMBOLS += _Unwind_Complete
EH_SYMBOLS += _Unwind_DeleteException
EH_SYMBOLS += _Unwind_Resume
#
# Additional functions for ARM
#
EH_SYMBOLS += __aeabi_unwind_cpp_pr0
EH_SYMBOLS += __aeabi_unwind_cpp_pr1
ifdef IS_LLVM
ifndef LIBCXX
error LIBCXX not configured
endif
ifndef LIBCXXABI
error LIBCXXABI not configured
endif
ifndef LIBUNWIND_BAREMETAL
error LIBUNWIND_BAREMETAL not configured
endif
ifndef LIBUNWIND
error LIBUNWIND not configured
endif
CPPFLAGS += -I@(LIBCXX)/include/c++/v1
CPPFLAGS += -I@(LIBCXXABI)/include
LLVM_LIBS += @(LIBCXXABI)/lib/libc++abi.a
endif
: foreach *.cc |> !cxx |> {obj}
REDEF_SYMBOLS = `echo $(EH_SYMBOLS) | awk -v RS=' ' '{ print "--redefine-sym "$1"=_cxx_"$1 }'`
: foreach *.c |> !cc |>
ifdef IS_LLVM
: {obj} |> \
$(LD) $(LD_MARCH) $(KEEP_SYMBOLS) -r %f $(LLVM_LIBS) @(LIBUNWIND)/lib/libunwind.a -o %o |> supc++.tmp
: {obj} |> \
$(LD) $(LD_MARCH) $(KEEP_SYMBOLS) -r %f $(LLVM_LIBS) @(LIBUNWIND_BAREMETAL)/lib/libunwind.a -o %o |> supc++-baremetal.tmp
: supc++.tmp |> @(OBJCOPY) $(LOCAL_SYMBOLS) $(REDEF_SYMBOLS) %f %o |> supc++.o
: supc++-baremetal.tmp |> @(OBJCOPY) $(LOCAL_SYMBOLS) $(REDEF_SYMBOLS) %f %o |> supc++-baremetal.o
: supc++.o unwind.o |> !ar |> cxx.a {bin}
: supc++-baremetal.o unwind.o |> !ar |> cxx-baremetal.a {bin}
: foreach {bin} |> !collect_static |>
: |> !emit_lib_pkg_config |>
endif
ifdef IS_GCC
LIBCXX_GCC += `$(CXX) $(CC_MARCH) -print-file-name=libsupc++.a`
LIBCXX_GCC += `$(CXX) $(CC_MARCH) -print-file-name=libgcc_eh.a`
: {obj} |> $(LD) $(LD_MARCH) $(KEEP_SYMBOLS) -r %f $(LIBCXX_GCC) -o %o |> supc++.tmp
: supc++.tmp |> @(OBJCOPY) $(LOCAL_SYMBOLS) $(REDEF_SYMBOLS) %f %o |> supc++.o
: supc++.o unwind.o |> !ar |> | $(BASE_DIR)/<cxx> {bin}
: foreach {bin} |> !collect_static |>
: |> !emit_lib_pkg_config |>
endif