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 += '*'