Allow dlclose() to properly call static C++ destructors.
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) NOTE: The NDK will need to be modified to enable this feature in the shared libraries that are generated through it. Change-Id: I99cd801375bbaef0581175893d1aa0943211b9bc
This commit is contained in:
parent
e8f79c1f5d
commit
3b43f87d29
@ -291,7 +291,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 \
|
||||||
@ -299,6 +298,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 \
|
||||||
@ -393,7 +393,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-timers.c \
|
bionic/pthread-timers.c \
|
||||||
bionic/ptrace.c \
|
bionic/ptrace.c \
|
||||||
@ -461,16 +460,27 @@ libc_common_c_includes := \
|
|||||||
$(LOCAL_PATH)/string \
|
$(LOCAL_PATH)/string \
|
||||||
$(LOCAL_PATH)/stdio
|
$(LOCAL_PATH)/stdio
|
||||||
|
|
||||||
|
# Needed to access private/__dso_handle.S from
|
||||||
|
# crtbegin_xxx.S and crtend_xxx.S
|
||||||
|
#
|
||||||
|
libc_crt_target_cflags += -I$(LOCAL_PATH)/private
|
||||||
|
|
||||||
# Define the libc run-time (crt) support object files that must be built,
|
# Define the libc run-time (crt) support object files that must be built,
|
||||||
# which are needed to build all other objects (shared/static libs and
|
# which are needed to build all other objects (shared/static libs and
|
||||||
# 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
|
Loading…
x
Reference in New Issue
Block a user