128 lines
3.2 KiB
Plaintext
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
|