Merge commit 'e1a739ec38a39fea9e66038dfc7cea364cb6a256' * commit 'e1a739ec38a39fea9e66038dfc7cea364cb6a256': Allow static C++ destructors to be properly called on dlclose().
This commit is contained in:
		
				
					committed by
					
						
						Android Git Automerger
					
				
			
			
				
	
			
			
			
					commit
					55cb28032d
				
			@@ -321,7 +321,6 @@ libc_common_src_files := \
 | 
				
			|||||||
# =========================================================
 | 
					# =========================================================
 | 
				
			||||||
ifeq ($(TARGET_ARCH),arm)
 | 
					ifeq ($(TARGET_ARCH),arm)
 | 
				
			||||||
libc_common_src_files += \
 | 
					libc_common_src_files += \
 | 
				
			||||||
	bionic/eabi.c \
 | 
					 | 
				
			||||||
	bionic/bionic_clone.c \
 | 
						bionic/bionic_clone.c \
 | 
				
			||||||
	arch-arm/bionic/__get_pc.S \
 | 
						arch-arm/bionic/__get_pc.S \
 | 
				
			||||||
	arch-arm/bionic/__get_sp.S \
 | 
						arch-arm/bionic/__get_sp.S \
 | 
				
			||||||
@@ -329,6 +328,7 @@ libc_common_src_files += \
 | 
				
			|||||||
	arch-arm/bionic/_setjmp.S \
 | 
						arch-arm/bionic/_setjmp.S \
 | 
				
			||||||
	arch-arm/bionic/atomics_arm.S \
 | 
						arch-arm/bionic/atomics_arm.S \
 | 
				
			||||||
	arch-arm/bionic/clone.S \
 | 
						arch-arm/bionic/clone.S \
 | 
				
			||||||
 | 
						arch-arm/bionic/eabi.c \
 | 
				
			||||||
	arch-arm/bionic/ffs.S \
 | 
						arch-arm/bionic/ffs.S \
 | 
				
			||||||
	arch-arm/bionic/kill.S \
 | 
						arch-arm/bionic/kill.S \
 | 
				
			||||||
	arch-arm/bionic/libgcc_compat.c \
 | 
						arch-arm/bionic/libgcc_compat.c \
 | 
				
			||||||
@@ -425,7 +425,6 @@ libc_common_src_files += \
 | 
				
			|||||||
	string/strncmp.c \
 | 
						string/strncmp.c \
 | 
				
			||||||
	string/memcmp.c \
 | 
						string/memcmp.c \
 | 
				
			||||||
	string/strlen.c \
 | 
						string/strlen.c \
 | 
				
			||||||
	bionic/eabi.c \
 | 
					 | 
				
			||||||
	bionic/pthread.c \
 | 
						bionic/pthread.c \
 | 
				
			||||||
	bionic/pthread-rwlocks.c \
 | 
						bionic/pthread-rwlocks.c \
 | 
				
			||||||
	bionic/pthread-timers.c \
 | 
						bionic/pthread-timers.c \
 | 
				
			||||||
@@ -494,6 +493,10 @@ else
 | 
				
			|||||||
    libc_common_cflags += -DANDROID_SMP=0
 | 
					    libc_common_cflags += -DANDROID_SMP=0
 | 
				
			||||||
endif
 | 
					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
 | 
					# Define some common includes
 | 
				
			||||||
# ========================================================
 | 
					# ========================================================
 | 
				
			||||||
@@ -508,10 +511,17 @@ libc_common_c_includes := \
 | 
				
			|||||||
# executables)
 | 
					# executables)
 | 
				
			||||||
# ==========================================================================
 | 
					# ==========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ifeq ($(TARGET_ARCH),x86)
 | 
					ifneq ($(filter arm x86,$(TARGET_ARCH)),)
 | 
				
			||||||
# we only need begin_so/end_so for x86, since it needs an appropriate .init
 | 
					# ARM and x86 need crtbegin_so/crtend_so.
 | 
				
			||||||
# 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.
 | 
					# 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 := $(TARGET_OUT_STATIC_LIBRARIES)/crtbegin_so.o
 | 
				
			||||||
$(GEN): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin_so.S
 | 
					$(GEN): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin_so.S
 | 
				
			||||||
	@mkdir -p $(dir $@)
 | 
						@mkdir -p $(dir $@)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,7 +31,7 @@
 | 
				
			|||||||
	.globl _start
 | 
						.globl _start
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# this is the small startup code that is first run when
 | 
					# this is the small startup code that is first run when
 | 
				
			||||||
# any executable that is statically-linked with Bionic
 | 
					# any executable that is dynamically-linked with Bionic
 | 
				
			||||||
# runs.
 | 
					# runs.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# it's purpose is to call __libc_init with appropriate
 | 
					# it's purpose is to call __libc_init with appropriate
 | 
				
			||||||
@@ -63,13 +63,7 @@ _start:
 | 
				
			|||||||
    .long   __INIT_ARRAY__
 | 
					    .long   __INIT_ARRAY__
 | 
				
			||||||
    .long   __FINI_ARRAY__
 | 
					    .long   __FINI_ARRAY__
 | 
				
			||||||
    .long   __CTOR_LIST__
 | 
					    .long   __CTOR_LIST__
 | 
				
			||||||
      
 | 
					
 | 
				
			||||||
# the .ctors section contains a list of pointers to "constructor"
 | 
					 | 
				
			||||||
# functions that need to be called in order during C library initialization,
 | 
					 | 
				
			||||||
# just before the program is being run. This is a C++ requirement
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# the last entry shall be 0, and is defined in crtend.S
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
	.section .preinit_array, "aw"
 | 
						.section .preinit_array, "aw"
 | 
				
			||||||
	.globl __PREINIT_ARRAY__
 | 
						.globl __PREINIT_ARRAY__
 | 
				
			||||||
__PREINIT_ARRAY__:
 | 
					__PREINIT_ARRAY__:
 | 
				
			||||||
@@ -90,3 +84,4 @@ __FINI_ARRAY__:
 | 
				
			|||||||
__CTOR_LIST__:
 | 
					__CTOR_LIST__:
 | 
				
			||||||
	.long -1
 | 
						.long -1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "__dso_handle.S"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										55
									
								
								libc/arch-arm/bionic/crtbegin_so.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								libc/arch-arm/bionic/crtbegin_so.S
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (C) 2008 The Android Open Source Project
 | 
				
			||||||
 | 
					 * All rights reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					 * modification, are permitted provided that the following conditions
 | 
				
			||||||
 | 
					 * are met:
 | 
				
			||||||
 | 
					 *  * Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					 *    notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					 *  * Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					 *    notice, this list of conditions and the following disclaimer in
 | 
				
			||||||
 | 
					 *    the documentation and/or other materials provided with the
 | 
				
			||||||
 | 
					 *    distribution.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
				
			||||||
 | 
					 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
				
			||||||
 | 
					 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 | 
				
			||||||
 | 
					 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 | 
				
			||||||
 | 
					 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 | 
				
			||||||
 | 
					 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 | 
				
			||||||
 | 
					 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 | 
				
			||||||
 | 
					 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 | 
				
			||||||
 | 
					 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 | 
				
			||||||
 | 
					 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 | 
				
			||||||
 | 
					 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
				
			||||||
 | 
					 * SUCH DAMAGE.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Implement static C++ destructors when the shared
 | 
				
			||||||
 | 
					# library is unloaded through dlclose().
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# A call to this function must be the first entry
 | 
				
			||||||
 | 
					# in the .fini_array. See 3.3.5.3.C of C++ ABI
 | 
				
			||||||
 | 
					# standard.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					__on_dlclose:
 | 
				
			||||||
 | 
					        adr     r0, 0f
 | 
				
			||||||
 | 
					        ldr     r0, [r0]
 | 
				
			||||||
 | 
					        b       __cxa_finalize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					0:
 | 
				
			||||||
 | 
					        .long   __dso_handle
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						.section .init_array, "aw"
 | 
				
			||||||
 | 
						.globl __INIT_ARRAY__
 | 
				
			||||||
 | 
					__INIT_ARRAY__:
 | 
				
			||||||
 | 
						.long -1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .section .fini_array, "aw"
 | 
				
			||||||
 | 
					        .globl __FINI_ARRAY__
 | 
				
			||||||
 | 
					__FINI_ARRAY__:
 | 
				
			||||||
 | 
					        .long -1
 | 
				
			||||||
 | 
					        .long __on_dlclose
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "__dso_handle.S"
 | 
				
			||||||
@@ -63,13 +63,7 @@ _start:
 | 
				
			|||||||
    .long   __INIT_ARRAY__
 | 
					    .long   __INIT_ARRAY__
 | 
				
			||||||
    .long   __FINI_ARRAY__
 | 
					    .long   __FINI_ARRAY__
 | 
				
			||||||
    .long   __CTOR_LIST__
 | 
					    .long   __CTOR_LIST__
 | 
				
			||||||
      
 | 
					
 | 
				
			||||||
# the .ctors section contains a list of pointers to "constructor"
 | 
					 | 
				
			||||||
# functions that need to be called in order during C library initialization,
 | 
					 | 
				
			||||||
# just before the program is being run. This is a C++ requirement
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# the last entry shall be 0, and is defined in crtend.S
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
	.section .preinit_array, "aw"
 | 
						.section .preinit_array, "aw"
 | 
				
			||||||
	.globl __PREINIT_ARRAY__
 | 
						.globl __PREINIT_ARRAY__
 | 
				
			||||||
__PREINIT_ARRAY__:
 | 
					__PREINIT_ARRAY__:
 | 
				
			||||||
@@ -90,3 +84,5 @@ __FINI_ARRAY__:
 | 
				
			|||||||
__CTOR_LIST__:
 | 
					__CTOR_LIST__:
 | 
				
			||||||
	.long -1
 | 
						.long -1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "__dso_handle.S"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										38
									
								
								libc/arch-arm/bionic/crtend_so.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								libc/arch-arm/bionic/crtend_so.S
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (C) 2010 The Android Open Source Project
 | 
				
			||||||
 | 
					 * All rights reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					 * modification, are permitted provided that the following conditions
 | 
				
			||||||
 | 
					 * are met:
 | 
				
			||||||
 | 
					 *  * Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					 *    notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					 *  * Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					 *    notice, this list of conditions and the following disclaimer in
 | 
				
			||||||
 | 
					 *    the documentation and/or other materials provided with the
 | 
				
			||||||
 | 
					 *    distribution.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
				
			||||||
 | 
					 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
				
			||||||
 | 
					 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 | 
				
			||||||
 | 
					 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 | 
				
			||||||
 | 
					 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 | 
				
			||||||
 | 
					 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 | 
				
			||||||
 | 
					 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 | 
				
			||||||
 | 
					 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 | 
				
			||||||
 | 
					 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 | 
				
			||||||
 | 
					 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 | 
				
			||||||
 | 
					 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
				
			||||||
 | 
					 * SUCH DAMAGE.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* This is the same than crtend.S except that a shared library
 | 
				
			||||||
 | 
					 * cannot have a .preinit_array
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						.section .init_array, "aw"
 | 
				
			||||||
 | 
						.long 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						.section .fini_array, "aw"
 | 
				
			||||||
 | 
						.long 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -30,7 +30,21 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
extern int  __cxa_atexit(void (*)(void*), void*, void* );
 | 
					extern int  __cxa_atexit(void (*)(void*), void*, void* );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void* __dso_handle = 0;
 | 
					/* Temporary hack: this variable should not be part of the C library
 | 
				
			||||||
 | 
					 * itself, but placed in the .bss section of each executable or
 | 
				
			||||||
 | 
					 * shared library instead.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * We keep it here temporarily until the build system has been
 | 
				
			||||||
 | 
					 * modified properly to use crtbegin_so.S and crtend_so.S when
 | 
				
			||||||
 | 
					 * generating shared libraries.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * It must be a 'weak' symbol to avoid conflicts with the definitions
 | 
				
			||||||
 | 
					 * that have been moved to crtbegin_static.S and crtbegin_dynamic.S
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * For the record, it is used for static C++ object construction
 | 
				
			||||||
 | 
					 * and destruction. See http://www.codesourcery.com/public/cxx-abi/abi.html#dso-dtor
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void* __attribute__((weak)) __dso_handle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* The "C++ ABI for ARM" document states that static C++ constructors,
 | 
					/* The "C++ ABI for ARM" document states that static C++ constructors,
 | 
				
			||||||
 * which are called from the .init_array, should manually call
 | 
					 * which are called from the .init_array, should manually call
 | 
				
			||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Copyright (C) 2009 The Android Open Source Project
 | 
					 * Copyright (C) 2009-2010 The Android Open Source Project
 | 
				
			||||||
 * All rights reserved.
 | 
					 * All rights reserved.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Redistribution and use in source and binary forms, with or without
 | 
					 * Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
@@ -31,7 +31,7 @@
 | 
				
			|||||||
.globl  _start
 | 
					.globl  _start
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# this is the small startup code that is first run when
 | 
					# this is the small startup code that is first run when
 | 
				
			||||||
# any executable that is statically-linked with Bionic
 | 
					# any executable that is dynamically-linked with Bionic
 | 
				
			||||||
# runs.
 | 
					# runs.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# it's purpose is to call __libc_init with appropriate
 | 
					# it's purpose is to call __libc_init with appropriate
 | 
				
			||||||
@@ -93,3 +93,5 @@ __FINI_ARRAY__:
 | 
				
			|||||||
    .globl __CTOR_LIST__
 | 
					    .globl __CTOR_LIST__
 | 
				
			||||||
__CTOR_LIST__:
 | 
					__CTOR_LIST__:
 | 
				
			||||||
    .long -1
 | 
					    .long -1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "__dso_handle.S"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Copyright (C) 2009 The Android Open Source Project
 | 
					 * Copyright (C) 2009-2010 The Android Open Source Project
 | 
				
			||||||
 * All rights reserved.
 | 
					 * All rights reserved.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Redistribution and use in source and binary forms, with or without
 | 
					 * Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
@@ -68,12 +68,6 @@ _start:
 | 
				
			|||||||
    .long   __FINI_ARRAY__
 | 
					    .long   __FINI_ARRAY__
 | 
				
			||||||
    .long   __CTOR_LIST__
 | 
					    .long   __CTOR_LIST__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# the .ctors section contains a list of pointers to "constructor"
 | 
					 | 
				
			||||||
# functions that need to be called in order during C library initialization,
 | 
					 | 
				
			||||||
# just before the program is being run. This is a C++ requirement
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# the last entry shall be 0, and is defined in crtend.S
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
    .section .preinit_array, "aw"
 | 
					    .section .preinit_array, "aw"
 | 
				
			||||||
    .globl __PREINIT_ARRAY__
 | 
					    .globl __PREINIT_ARRAY__
 | 
				
			||||||
__PREINIT_ARRAY__:
 | 
					__PREINIT_ARRAY__:
 | 
				
			||||||
@@ -94,3 +88,4 @@ __FINI_ARRAY__:
 | 
				
			|||||||
__CTOR_LIST__:
 | 
					__CTOR_LIST__:
 | 
				
			||||||
    .long -1
 | 
					    .long -1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "__dso_handle.S"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,7 +30,7 @@
 | 
				
			|||||||
	.globl _start
 | 
						.globl _start
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# this is the small startup code that is first run when
 | 
					# this is the small startup code that is first run when
 | 
				
			||||||
# any executable that is statically-linked with Bionic
 | 
					# any executable that is dynamically-linked with Bionic
 | 
				
			||||||
# runs.
 | 
					# runs.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# it's purpose is to call __libc_init with appropriate
 | 
					# it's purpose is to call __libc_init with appropriate
 | 
				
			||||||
@@ -94,3 +94,4 @@ __FINI_ARRAY__:
 | 
				
			|||||||
__CTOR_LIST__:
 | 
					__CTOR_LIST__:
 | 
				
			||||||
	.long -1
 | 
						.long -1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "__dso_handle.S"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,10 @@
 | 
				
			|||||||
 | 
					# This function is to be called when the shared library
 | 
				
			||||||
 | 
					# is unloaded through dlclose()
 | 
				
			||||||
 | 
					_on_dlclose:
 | 
				
			||||||
 | 
					    lea __dso_handle, %eax
 | 
				
			||||||
 | 
					    call __cxa_finalize
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* we put the _init() function here in case the user files for the shared
 | 
					/* we put the _init() function here in case the user files for the shared
 | 
				
			||||||
 * libs want to drop things into .init section.
 | 
					 * libs want to drop things into .init section.
 | 
				
			||||||
 * We then will call our ctors from crtend_so.o */
 | 
					 * We then will call our ctors from crtend_so.o */
 | 
				
			||||||
@@ -20,6 +27,7 @@ __INIT_ARRAY__:
 | 
				
			|||||||
.globl __FINI_ARRAY__
 | 
					.globl __FINI_ARRAY__
 | 
				
			||||||
__FINI_ARRAY__:
 | 
					__FINI_ARRAY__:
 | 
				
			||||||
    .long -1
 | 
					    .long -1
 | 
				
			||||||
 | 
					    .long _on_dlclose
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.section .ctors, "aw"
 | 
					.section .ctors, "aw"
 | 
				
			||||||
.align 4
 | 
					.align 4
 | 
				
			||||||
@@ -27,3 +35,5 @@ __FINI_ARRAY__:
 | 
				
			|||||||
.globl __CTOR_LIST__
 | 
					.globl __CTOR_LIST__
 | 
				
			||||||
__CTOR_LIST__:
 | 
					__CTOR_LIST__:
 | 
				
			||||||
        .long -1
 | 
					        .long -1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "__dso_handle.S"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -67,12 +67,6 @@ _start:
 | 
				
			|||||||
    .long   __FINI_ARRAY__
 | 
					    .long   __FINI_ARRAY__
 | 
				
			||||||
    .long   __CTOR_LIST__
 | 
					    .long   __CTOR_LIST__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# the .ctors section contains a list of pointers to "constructor"
 | 
					 | 
				
			||||||
# functions that need to be called in order during C library initialization,
 | 
					 | 
				
			||||||
# just before the program is being run. This is a C++ requirement
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# the last entry shall be 0, and is defined in crtend.S
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
	.section .preinit_array, "aw"
 | 
						.section .preinit_array, "aw"
 | 
				
			||||||
	.globl __PREINIT_ARRAY__
 | 
						.globl __PREINIT_ARRAY__
 | 
				
			||||||
__PREINIT_ARRAY__:
 | 
					__PREINIT_ARRAY__:
 | 
				
			||||||
@@ -93,3 +87,4 @@ __FINI_ARRAY__:
 | 
				
			|||||||
__CTOR_LIST__:
 | 
					__CTOR_LIST__:
 | 
				
			||||||
	.long -1
 | 
						.long -1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "__dso_handle.S"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										37
									
								
								libc/private/__dso_handle.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								libc/private/__dso_handle.S
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (C) 2010 The Android Open Source Project
 | 
				
			||||||
 | 
					 * All rights reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					 * modification, are permitted provided that the following conditions
 | 
				
			||||||
 | 
					 * are met:
 | 
				
			||||||
 | 
					 *  * Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					 *    notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					 *  * Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					 *    notice, this list of conditions and the following disclaimer in
 | 
				
			||||||
 | 
					 *    the documentation and/or other materials provided with the
 | 
				
			||||||
 | 
					 *    distribution.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
				
			||||||
 | 
					 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
				
			||||||
 | 
					 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 | 
				
			||||||
 | 
					 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 | 
				
			||||||
 | 
					 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 | 
				
			||||||
 | 
					 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 | 
				
			||||||
 | 
					 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 | 
				
			||||||
 | 
					 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 | 
				
			||||||
 | 
					 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 | 
				
			||||||
 | 
					 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 | 
				
			||||||
 | 
					 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
				
			||||||
 | 
					 * SUCH DAMAGE.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# The __dso_handle global variable is used by static
 | 
				
			||||||
 | 
					# C++ constructors and destructors in the binary.
 | 
				
			||||||
 | 
					# See http://www.codesourcery.com/public/cxx-abi/abi.html#dso-dtor
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					        .section .bss
 | 
				
			||||||
 | 
					        .align 4
 | 
				
			||||||
 | 
					        .globl __dso_handle
 | 
				
			||||||
 | 
					__dso_handle:
 | 
				
			||||||
 | 
					        .long 0
 | 
				
			||||||
		Reference in New Issue
	
	Block a user