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