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 |> !ar |> cxx.a {bin} : supc++-baremetal.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)/ {bin} : foreach {bin} |> !collect_static |> : |> !emit_lib_pkg_config |> endif