diff options
author | Dmitriy Ivanov <dimitry@google.com> | 2014-08-26 14:16:52 -0700 |
---|---|---|
committer | Dmitriy Ivanov <dimitry@google.com> | 2014-10-01 15:52:38 -0700 |
commit | 93c3f4203c92ece8b97d770af9b675f5ffb90c67 (patch) | |
tree | 3bfc09cfd24faca89b56ad21d5e6bfc907da312b /linker | |
parent | 3bbd218ef1a70e59662e704c59af6dff1f9d1253 (diff) | |
download | bionic-93c3f4203c92ece8b97d770af9b675f5ffb90c67.zip bionic-93c3f4203c92ece8b97d770af9b675f5ffb90c67.tar.gz bionic-93c3f4203c92ece8b97d770af9b675f5ffb90c67.tar.bz2 |
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
Diffstat (limited to 'linker')
-rw-r--r-- | linker/Android.mk | 1 | ||||
-rw-r--r-- | linker/linked_list.h | 3 | ||||
-rw-r--r-- | linker/linker.cpp | 13 | ||||
-rw-r--r-- | linker/linker_libc_support.c | 17 |
4 files changed, 23 insertions, 11 deletions
diff --git a/linker/Android.mk b/linker/Android.mk index 5853c90..4298032 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 8096e62..e51eb9c 100644 --- a/linker/linked_list.h +++ b/linker/linked_list.h @@ -32,6 +32,9 @@ template<typename T, typename Allocator> class LinkedList { public: LinkedList() : head_(nullptr), tail_(nullptr) {} + ~LinkedList() { + clear(); + } void push_front(T* const element) { LinkedListEntry<T>* new_entry = Allocator::alloc(); diff --git a/linker/linker.cpp b/linker/linker.cpp index e4a6523..6aba394 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 0000000..17db6d4 --- /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" |