Hide C++ stuff in libc. Put it back in libstdc++.
Bug: 17062445
Change-Id: I027b186719654c2865b08c3fa83f90fa00c1e838
diff --git a/libc/Android.mk b/libc/Android.mk
index 72ea6ed..ca22bbc 100644
--- a/libc/Android.mk
+++ b/libc/Android.mk
@@ -103,8 +103,6 @@
bionic/__cmsg_nxthdr.cpp \
bionic/connect.cpp \
bionic/ctype.cpp \
- bionic/__cxa_guard.cpp \
- bionic/__cxa_pure_virtual.cpp \
bionic/dirent.cpp \
bionic/dup2.cpp \
bionic/epoll_create.cpp \
@@ -143,7 +141,6 @@
bionic/mknod.cpp \
bionic/mntent.cpp \
bionic/NetdClientDispatch.cpp \
- bionic/new.cpp \
bionic/open.cpp \
bionic/pause.cpp \
bionic/pipe.cpp \
@@ -231,6 +228,11 @@
bionic/wchar.cpp \
bionic/wctype.cpp \
+libc_cxa_src_files := \
+ bionic/__cxa_guard.cpp \
+ bionic/__cxa_pure_virtual.cpp \
+ bionic/new.cpp \
+
libc_upstream_freebsd_src_files := \
upstream-freebsd/lib/libc/gen/ldexp.c \
upstream-freebsd/lib/libc/gen/sleep.c \
@@ -807,6 +809,27 @@
# ========================================================
+# libc_cxa.a - Things traditionally in libstdc++
+# ========================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(libc_cxa_src_files)
+LOCAL_CFLAGS := $(libc_common_cflags) \
+ -fvisibility=hidden \
+
+LOCAL_CONLYFLAGS := $(libc_common_conlyflags)
+LOCAL_CPPFLAGS := $(libc_common_cppflags)
+LOCAL_C_INCLUDES := $(libc_common_c_includes)
+LOCAL_MODULE := libc_cxa
+LOCAL_CLANG := true # GCC refuses to hide new/delete
+LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
+LOCAL_SYSTEM_SHARED_LIBRARIES :=
+
+include $(BUILD_STATIC_LIBRARY)
+
+
+# ========================================================
# libc_syscalls.a
# ========================================================
@@ -858,6 +881,7 @@
LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
LOCAL_WHOLE_STATIC_LIBRARIES := \
libc_bionic \
+ libc_cxa \
libc_dns \
libc_freebsd \
libc_gdtoa \
@@ -1105,6 +1129,36 @@
endif #!user
+# ========================================================
+# libstdc++.so
+# ========================================================
+libstdcxx_common_src_files := \
+ bionic/__cxa_guard.cpp \
+ bionic/__cxa_pure_virtual.cpp \
+ bionic/new.cpp \
+ bionic/libc_logging.cpp \
+
+include $(CLEAR_VARS)
+LOCAL_C_INCLUDES := $(libc_common_c_includes)
+LOCAL_CFLAGS := $(libc_common_cflags)
+LOCAL_SRC_FILES := $(libstdcxx_common_src_files)
+LOCAL_MODULE:= libstdc++
+LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
+LOCAL_SYSTEM_SHARED_LIBRARIES := libc
+include $(BUILD_SHARED_LIBRARY)
+
+# ========================================================
+# libstdc++.a
+# ========================================================
+include $(CLEAR_VARS)
+LOCAL_C_INCLUDES := $(libc_common_c_includes)
+LOCAL_CFLAGS := $(libc_common_cflags)
+LOCAL_SRC_FILES := $(libstdcxx_common_src_files)
+LOCAL_MODULE:= libstdc++
+LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
+LOCAL_SYSTEM_SHARED_LIBRARIES := libc
+include $(BUILD_STATIC_LIBRARY)
+
# ========================================================
include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/libc/tools/check-symbols-glibc.py b/libc/tools/check-symbols-glibc.py
index ffff964..8326730 100755
--- a/libc/tools/check-symbols-glibc.py
+++ b/libc/tools/check-symbols-glibc.py
@@ -172,24 +172,6 @@
'dn_expand',
'nsdispatch',
])
-# libstdc++ stuff we took over.
-libstdcxx_stuff = set([
- # new, delete, nothrow
- '_ZSt7nothrow',
- '_ZdaPv',
- '_ZdaPvRKSt9nothrow_t',
- '_ZdlPv',
- '_ZdlPvRKSt9nothrow_t',
- '_Znam',
- '_ZnamRKSt9nothrow_t',
- '_Znwm',
- '_ZnwmRKSt9nothrow_t',
-
- '__cxa_guard_abort',
- '__cxa_guard_acquire',
- '__cxa_guard_release',
- '__cxa_pure_virtual',
-])
# Implementation details we know we export (and can't get away from).
known = set([
'_ctype_',
@@ -210,8 +192,7 @@
print 'in bionic but not glibc:'
allowed_stuff = (bsd_stuff | FORTIFY_stuff | linux_stuff | macro_stuff |
- std_stuff | weird_stuff | libresolv_stuff | libstdcxx_stuff |
- known)
+ std_stuff | weird_stuff | libresolv_stuff | known)
for symbol in sorted((bionic - allowed_stuff).difference(glibc)):
if symbol in ndk_ignored:
symbol += '*'