diff options
author | David 'Digit' Turner <digit@google.com> | 2010-06-18 14:47:22 -0700 |
---|---|---|
committer | David 'Digit' Turner <digit@google.com> | 2010-06-18 16:07:10 -0700 |
commit | 6a9b888d7c4b246f6f66360789c72b754ff85021 (patch) | |
tree | d27e4487c13f200d4cfe193f950e25a01efa7743 /libc/Android.mk | |
parent | 6a09cfd9f916e3a60de707ff0806cdeb143d77a4 (diff) | |
download | bionic-6a9b888d7c4b246f6f66360789c72b754ff85021.zip bionic-6a9b888d7c4b246f6f66360789c72b754ff85021.tar.gz bionic-6a9b888d7c4b246f6f66360789c72b754ff85021.tar.bz2 |
Allow static C++ destructors to be properly called on dlclose().
With this patch, _and_ an upcoming build/ patch, the destruction
of static C++ objects contained in shared libraries will happen
properly when dlclose() is called.
Note that this change introduces crtbegin_so.S and crtend_so.S which
are currently ignored by the build system.
+ move definition of __dso_handle to the right place
(before that, all shared libraries used the __dso_handle
global variable from the C library).
Note that we keep a 'weak' __dso_handle in aeabi.c to avoid
breaking the build until the next patch to build/core/combo/
appears. We will be able to remove that later.
+ move bionic/aeabi.c to arch-arm/bionic/ (its proper location)
Change-Id: Ie771aa204e3acbdf02fd30ebd4150373a1398f39
NOTE: The NDK will need to be modified to enable this feature in
the shared libraries that are generated through it.
Diffstat (limited to 'libc/Android.mk')
-rw-r--r-- | libc/Android.mk | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/libc/Android.mk b/libc/Android.mk index 79c89ed..6b2334e 100644 --- a/libc/Android.mk +++ b/libc/Android.mk @@ -317,7 +317,6 @@ libc_common_src_files := \ # ========================================================= ifeq ($(TARGET_ARCH),arm) libc_common_src_files += \ - bionic/eabi.c \ bionic/bionic_clone.c \ arch-arm/bionic/__get_pc.S \ arch-arm/bionic/__get_sp.S \ @@ -325,6 +324,7 @@ libc_common_src_files += \ arch-arm/bionic/_setjmp.S \ arch-arm/bionic/atomics_arm.S \ arch-arm/bionic/clone.S \ + arch-arm/bionic/eabi.c \ arch-arm/bionic/ffs.S \ arch-arm/bionic/kill.S \ arch-arm/bionic/libgcc_compat.c \ @@ -421,7 +421,6 @@ libc_common_src_files += \ string/strncmp.c \ string/memcmp.c \ string/strlen.c \ - bionic/eabi.c \ bionic/pthread.c \ bionic/pthread-rwlocks.c \ bionic/pthread-timers.c \ @@ -490,6 +489,10 @@ else libc_common_cflags += -DANDROID_SMP=0 endif +# Needed to access private/__dso_handle.S from +# crtbegin_xxx.S and crtend_xxx.S +# +libc_crt_target_cflags += -I$(LOCAL_PATH)/private # Define some common includes # ======================================================== @@ -504,10 +507,17 @@ libc_common_c_includes := \ # executables) # ========================================================================== -ifeq ($(TARGET_ARCH),x86) -# we only need begin_so/end_so for x86, since it needs an appropriate .init -# section in the shared library with a function to call all the entries in -# .ctors section. ARM uses init_array, and does not need the function. +ifneq ($(filter arm x86,$(TARGET_ARCH)),) +# ARM and x86 need crtbegin_so/crtend_so. +# +# For x86, the .init section must point to a function that calls all +# entries in the .ctors section. (on ARM this is done through the +# .init_array section instead). +# +# For both platforms, the .fini_array section must point to a function +# that will call __cxa_finalize(&__dso_handle) in order to ensure that +# static C++ destructors are properly called on dlclose(). +# GEN := $(TARGET_OUT_STATIC_LIBRARIES)/crtbegin_so.o $(GEN): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin_so.S @mkdir -p $(dir $@) |