From 93c3f4203c92ece8b97d770af9b675f5ffb90c67 Mon Sep 17 00:00:00 2001 From: Dmitriy Ivanov Date: Tue, 26 Aug 2014 14:16:52 -0700 Subject: [PATCH] Enable __cxa_atexit && __cxa_finalize for linker This allows adding destructors to classes used for global variables. (cherry picked from commit 14241402de0faa4b244b1bd6b1f0799ce169b880) Change-Id: I1d8776130d1e01a8c53d23a2949f5010f4c96b16 --- linker/Android.mk | 1 + linker/linked_list.h | 3 +++ linker/linker.cpp | 13 ++----------- linker/linker_libc_support.c | 17 +++++++++++++++++ tests/Android.mk | 2 +- 5 files changed, 24 insertions(+), 12 deletions(-) create mode 100644 linker/linker_libc_support.c diff --git a/linker/Android.mk b/linker/Android.mk index 5853c9070..4298032a4 100644 --- a/linker/Android.mk +++ b/linker/Android.mk @@ -8,6 +8,7 @@ LOCAL_SRC_FILES:= \ linker.cpp \ linker_allocator.cpp \ linker_environ.cpp \ + linker_libc_support.c \ linker_phdr.cpp \ rt.cpp \ diff --git a/linker/linked_list.h b/linker/linked_list.h index 8096e623d..e51eb9cb0 100644 --- a/linker/linked_list.h +++ b/linker/linked_list.h @@ -32,6 +32,9 @@ template class LinkedList { public: LinkedList() : head_(nullptr), tail_(nullptr) {} + ~LinkedList() { + clear(); + } void push_front(T* const element) { LinkedListEntry* new_entry = Allocator::alloc(); diff --git a/linker/linker.cpp b/linker/linker.cpp index e4a6523b7..6aba39471 100644 --- a/linker/linker.cpp +++ b/linker/linker.cpp @@ -2199,16 +2199,6 @@ static void init_linker_info_for_gdb(ElfW(Addr) linker_base) { * and other non-local data at this point. */ static ElfW(Addr) __linker_init_post_relocation(KernelArgumentBlock& args, ElfW(Addr) linker_base) { - /* NOTE: we store the args pointer on a special location - * of the temporary TLS area in order to pass it to - * the C Library's runtime initializer. - * - * The initializer must clear the slot and reset the TLS - * to point to a different location to ensure that no other - * shared library constructor can access it. - */ - __libc_init_tls(args); - #if TIMING struct timeval t0, t1; gettimeofday(&t0, 0); @@ -2435,6 +2425,8 @@ extern "C" ElfW(Addr) __linker_init(void* raw_args) { _exit(EXIT_FAILURE); } + __libc_init_tls(args); + // Initialize the linker's own global variables linker_so.CallConstructors(); @@ -2444,7 +2436,6 @@ extern "C" ElfW(Addr) __linker_init(void* raw_args) { solist = get_libdl_info(); sonext = get_libdl_info(); - // We have successfully fixed our own relocations. It's safe to run // the main part of the linker now. args.abort_message_ptr = &g_abort_message; diff --git a/linker/linker_libc_support.c b/linker/linker_libc_support.c new file mode 100644 index 000000000..17db6d4e7 --- /dev/null +++ b/linker/linker_libc_support.c @@ -0,0 +1,17 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../libc/arch-common/bionic/__dso_handle.h" diff --git a/tests/Android.mk b/tests/Android.mk index 9ee33e004..864052e81 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -358,7 +358,7 @@ endif ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),x86_64)) # add target to run lp32 tests -bionic-unit-tests-run-on-host32: bionic-unit-tests $(TARGET_OUT_EXECUTABLES)/$(LINKER) $(TARGET_OUT_EXECUTABLES)/sh +bionic-unit-tests-run-on-host32: bionic-unit-tests_32 $(TARGET_OUT_EXECUTABLES)/$(LINKER) $(TARGET_OUT_EXECUTABLES)/sh if [ ! -d /system -o ! -d /system/bin ]; then \ echo "Attempting to create /system/bin"; \ sudo mkdir -p -m 0777 /system/bin; \ -- 2.11.0