16a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner/*
220c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin * Copyright (C) 2012 The Android Open Source Project
36a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner * All rights reserved.
46a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner *
56a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner * Redistribution and use in source and binary forms, with or without
66a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner * modification, are permitted provided that the following conditions
76a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner * are met:
86a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner *  * Redistributions of source code must retain the above copyright
96a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner *    notice, this list of conditions and the following disclaimer.
106a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner *  * Redistributions in binary form must reproduce the above copyright
116a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner *    notice, this list of conditions and the following disclaimer in
126a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner *    the documentation and/or other materials provided with the
136a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner *    distribution.
146a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner *
156a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
166a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
176a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
186a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
196a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
206a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
216a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
226a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
236a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
246a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
256a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
266a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner * SUCH DAMAGE.
276a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner */
286a9b888d7c4b246f6f66360789c72b754ff85021David 'Digit' Turner
2920c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupinextern void __cxa_finalize(void *);
3020c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupinextern void *__dso_handle;
3139640842823ba4cd42bd11514c0da39aa939519fBruce Beare
3220c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin__attribute__((visibility("hidden"),destructor))
3320c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupinvoid __on_dlclose() {
3420c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin  __cxa_finalize(&__dso_handle);
3520c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin}
3639640842823ba4cd42bd11514c0da39aa939519fBruce Beare
3720c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin/* CRT_LEGACY_WORKAROUND should only be defined when building
3820c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin * this file as part of the platform's C library.
3920c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin *
4020c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin * The C library already defines a function named 'atexit()'
4120c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin * for backwards compatibility with older NDK-generated binaries.
4220c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin *
4320c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin * For newer ones, 'atexit' is actually embedded in the C
4420c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin * runtime objects that are linked into the final ELF
4520c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin * binary (shared library or executable), and will call
4620c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin * __cxa_atexit() in order to un-register any atexit()
4720c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin * handler when a library is unloaded.
4820c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin *
4920c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin * This function must be global *and* hidden. Only the
5020c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin * code inside the same ELF binary should be able to access it.
5120c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin */
5220c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin
5320c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin#ifdef CRT_LEGACY_WORKAROUND
5420c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin#include "__dso_handle.h"
5520c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin#else
5620c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin#include "__dso_handle_so.h"
5720c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin#include "atexit.h"
5820c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin#include "__stack_chk_fail_local.h"
5920c4a3a8eee5ca8c87ae377732f541baffce1fdaPavel Chupin#endif
60