Fix x86_64 build, clean up intermediate libraries.

The x86_64 build was failing because clone.S had a call to __thread_entry which
was being added to a different intermediate .a on the way to making libc.so,
and the linker couldn't guarantee statically that such a relocation would be
possible.

  ld: error: out/target/product/generic_x86_64/obj/STATIC_LIBRARIES/libc_common_intermediates/libc_common.a(clone.o): requires dynamic R_X86_64_PC32 reloc against '__thread_entry' which may overflow at runtime; recompile with -fPIC

This patch addresses that by ensuring that the caller and callee end up in the
same intermediate .a. While I'm here, I've tried to clean up some of the mess
that led to this situation too. In particular, this removes libc/private/ from
the default include path (except for the DNS code), and splits out the DNS
code into its own library (since it's a weird special case of upstream NetBSD
code that's diverged so heavily it's unlikely ever to get back in sync).

There's more cleanup of the DNS situation possible, but this is definitely a
step in the right direction, and it's more than enough to get x86_64 building
cleanly.

Change-Id: I00425a7245b7a2573df16cc38798187d0729e7c4
This commit is contained in:
Elliott Hughes 2013-10-09 15:50:50 -07:00
parent 0c17099a71
commit eb847bc866
90 changed files with 239 additions and 209 deletions

View File

@ -151,34 +151,38 @@ libc_common_src_files := \
bionic/usleep.c \
bionic/utmp.c \
bionic/wcscoll.c \
netbsd/gethnamaddr.c \
netbsd/inet/nsap_addr.c \
netbsd/resolv/__dn_comp.c \
netbsd/resolv/__res_close.c \
netbsd/resolv/__res_send.c \
netbsd/resolv/herror.c \
netbsd/resolv/res_comp.c \
netbsd/resolv/res_data.c \
netbsd/resolv/res_debug.c \
netbsd/resolv/res_init.c \
netbsd/resolv/res_mkquery.c \
netbsd/resolv/res_query.c \
netbsd/resolv/res_send.c \
netbsd/resolv/res_state.c \
netbsd/resolv/res_cache.c \
netbsd/net/nsdispatch.c \
netbsd/net/getaddrinfo.c \
netbsd/net/getnameinfo.c \
netbsd/net/getservbyname.c \
netbsd/net/getservent.c \
netbsd/net/base64.c \
netbsd/net/getservbyport.c \
netbsd/nameser/ns_name.c \
netbsd/nameser/ns_parse.c \
netbsd/nameser/ns_ttl.c \
netbsd/nameser/ns_netint.c \
netbsd/nameser/ns_print.c \
netbsd/nameser/ns_samedomain.c \
libc_dns_src_files += \
netbsd/gethnamaddr.c \
netbsd/inet/nsap_addr.c \
netbsd/nameser/ns_name.c \
netbsd/nameser/ns_netint.c \
netbsd/nameser/ns_parse.c \
netbsd/nameser/ns_print.c \
netbsd/nameser/ns_samedomain.c \
netbsd/nameser/ns_ttl.c \
netbsd/net/base64.c \
netbsd/net/getaddrinfo.c \
netbsd/net/getnameinfo.c \
netbsd/net/getservbyname.c \
netbsd/net/getservbyport.c \
netbsd/net/getservent.c \
netbsd/net/nsdispatch.c \
netbsd/resolv/__dn_comp.c \
netbsd/resolv/herror.c \
netbsd/resolv/res_cache.c \
netbsd/resolv/__res_close.c \
netbsd/resolv/res_comp.c \
netbsd/resolv/res_data.c \
netbsd/resolv/res_debug.c \
netbsd/resolv/res_init.c \
netbsd/resolv/res_mkquery.c \
netbsd/resolv/res_query.c \
netbsd/resolv/__res_send.c \
netbsd/resolv/res_send.c \
netbsd/resolv/res_state.c \
# These are shared by all the 32-bit targets, but not the 64-bit ones.
ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),arm mips x86))
@ -254,6 +258,7 @@ libc_bionic_src_files := \
bionic/stubs.cpp \
bionic/sysconf.cpp \
bionic/tdestroy.cpp \
bionic/__thread_entry.cpp \
bionic/tmpfile.cpp \
bionic/wait.cpp \
bionic/wchar.cpp \
@ -504,10 +509,10 @@ libc_common_src_files += \
upstream-freebsd/lib/libc/string/wmemcmp.c \
libc_common_src_files += \
bionic/pthread-atfork.c \
bionic/pthread-rwlocks.c \
bionic/pthread-timers.c \
bionic/ptrace.c
bionic/pthread-atfork.c \
bionic/pthread-rwlocks.c \
bionic/pthread-timers.c \
bionic/ptrace.c \
libc_static_common_src_files += \
bionic/pthread.c \
@ -549,8 +554,8 @@ libc_common_additional_dependencies += \
$(LOCAL_PATH)/arch-$(TARGET_ARCH)/$(TARGET_ARCH).mk
include $(LOCAL_PATH)/arch-$(TARGET_ARCH)/$(TARGET_ARCH).mk
libc_common_src_files += $(_LIBC_ARCH_COMMON_SRC_FILES)
libc_common_src_files += $(_LIBC_ARCH_CPU_VARIANT_SRC_FILES)
libc_bionic_src_files += $(_LIBC_ARCH_COMMON_SRC_FILES)
libc_bionic_src_files += $(_LIBC_ARCH_CPU_VARIANT_SRC_FILES)
libc_arch_static_src_files := $(_LIBC_ARCH_STATIC_SRC_FILES)
libc_arch_dynamic_src_files := $(_LIBC_ARCH_DYNAMIC_SRC_FILES)
libc_common_additional_dependencies += $(_LIBC_ARCH_ADDITIONAL_DEPENDENCIES)
@ -560,9 +565,6 @@ libc_common_additional_dependencies += $(_LIBC_ARCH_ADDITIONAL_DEPENDENCIES)
libc_common_cflags := \
-DANDROID_CHANGES \
-D_LIBC=1 \
-DINET6 \
-I$(LOCAL_PATH)/private \
-DPOSIX_MISTAKE \
-Wall -Wextra \
# Try to catch typical 32-bit assumptions that break with 64-bit pointers.
@ -616,7 +618,8 @@ endif
# crtbrand.c needs <stdint.h> and a #define for the platform SDK version.
libc_crt_target_cflags += \
-I$(LOCAL_PATH)/include \
-DPLATFORM_SDK_VERSION=$(PLATFORM_SDK_VERSION)
-I$(LOCAL_PATH)/arch-$(TARGET_ARCH)/include \
-DPLATFORM_SDK_VERSION=$(PLATFORM_SDK_VERSION) \
# Define some common conlyflags
libc_common_conlyflags := \
@ -634,12 +637,6 @@ libc_common_c_includes := \
$(LOCAL_PATH)/stdio \
external/safe-iop/include
# Needed to access private/__dso_handle.h from
# crtbegin_xxx.S and crtend_xxx.S
libc_crt_target_cflags += \
-I$(LOCAL_PATH)/private \
-I$(LOCAL_PATH)/arch-$(TARGET_ARCH)/include
# 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
# executables)
@ -808,6 +805,29 @@ LOCAL_SYSTEM_SHARED_LIBRARIES :=
include $(BUILD_STATIC_LIBRARY)
# ========================================================
# libc_dns.a - modified NetBSD DNS code
# ========================================================
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(libc_dns_src_files)
LOCAL_CFLAGS := \
$(libc_common_cflags) \
-DINET6 \
-I$(LOCAL_PATH)/private \
-I$(LOCAL_PATH)/upstream-netbsd/libc/include # for NetBSD private headers
LOCAL_CONLYFLAGS := $(libc_common_conlyflags)
LOCAL_CPPFLAGS := $(libc_common_cppflags)
LOCAL_C_INCLUDES := $(libc_common_c_includes)
LOCAL_MODULE := libc_dns
LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
LOCAL_SYSTEM_SHARED_LIBRARIES :=
include $(BUILD_STATIC_LIBRARY)
# ========================================================
# libc_freebsd.a - upstream FreeBSD C library code
# ========================================================
@ -845,6 +865,7 @@ include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(libc_upstream_netbsd_src_files)
LOCAL_CFLAGS := \
$(libc_common_cflags) \
-DPOSIX_MISTAKE \
-I$(LOCAL_PATH)/upstream-netbsd \
-I$(LOCAL_PATH)/upstream-netbsd/libc/include \
-include upstream-netbsd/netbsd-compat.h
@ -883,8 +904,7 @@ include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(libc_common_src_files)
LOCAL_CFLAGS := $(libc_common_cflags) \
-I$(LOCAL_PATH)/upstream-netbsd/libc/include # for netbsd private headers
LOCAL_CFLAGS := $(libc_common_cflags)
LOCAL_CONLYFLAGS := $(libc_common_conlyflags)
LOCAL_CPPFLAGS := $(libc_common_cppflags)
LOCAL_C_INCLUDES := $(libc_common_c_includes)
@ -893,9 +913,11 @@ LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
LOCAL_WHOLE_STATIC_LIBRARIES := \
libbionic_ssp \
libc_bionic \
libc_dns \
libc_freebsd \
libc_netbsd \
libc_tzcode
libc_tzcode \
LOCAL_SYSTEM_SHARED_LIBRARIES :=
# TODO: split out the asflags.

View File

@ -27,9 +27,10 @@
*/
#include <sys/types.h>
#include <private/libc_logging.h>
#include <stdio.h>
#include "private/libc_logging.h"
/*
* This source file should only be included by libc.so, its purpose is
* to support legacy ARM binaries by exporting a publicly visible

View File

@ -27,7 +27,7 @@
*/
#include <machine/asm.h>
#include "libc_events.h"
#include "private/libc_events.h"
.syntax unified

View File

@ -27,7 +27,7 @@
*/
#include <machine/asm.h>
#include "libc_events.h"
#include "private/libc_events.h"
.syntax unified

View File

@ -56,7 +56,7 @@
// Prototype: void *memcpy (void *dst, const void *src, size_t count).
#include <machine/asm.h>
#include "libc_events.h"
#include "private/libc_events.h"
.text
.syntax unified

View File

@ -28,7 +28,7 @@
#include <machine/cpu-features.h>
#include <machine/asm.h>
#include "libc_events.h"
#include "private/libc_events.h"
/*
* Optimized memset() for ARM.

View File

@ -27,7 +27,7 @@
*/
#include <machine/asm.h>
#include "libc_events.h"
#include "private/libc_events.h"
.syntax unified
.fpu neon

View File

@ -27,7 +27,7 @@
*/
#include <machine/asm.h>
#include "libc_events.h"
#include "private/libc_events.h"
.syntax unified
.fpu neon

View File

@ -27,7 +27,7 @@
*/
#include <machine/asm.h>
#include "libc_events.h"
#include "private/libc_events.h"
/*
* This code assumes it is running on a processor that supports all arm v7

View File

@ -28,7 +28,7 @@
#include <machine/cpu-features.h>
#include <machine/asm.h>
#include "libc_events.h"
#include "private/libc_events.h"
/*
* This code assumes it is running on a processor that supports all arm v7

View File

@ -28,7 +28,7 @@
#include <machine/cpu-features.h>
#include <machine/asm.h>
#include "libc_events.h"
#include "private/libc_events.h"
/*
* Optimized memcpy() for ARM.

View File

@ -27,7 +27,7 @@
*/
#include <machine/asm.h>
#include "libc_events.h"
#include "private/libc_events.h"
/*
* Optimized memset() for ARM.

View File

@ -27,7 +27,7 @@
*/
#include <machine/asm.h>
#include "libc_events.h"
#include "private/libc_events.h"
.syntax unified

View File

@ -27,7 +27,7 @@
*/
#include <machine/asm.h>
#include "libc_events.h"
#include "private/libc_events.h"
.syntax unified

View File

@ -29,7 +29,7 @@
/* Assumes neon instructions and a cache line size of 32 bytes. */
#include <machine/asm.h>
#include "libc_events.h"
#include "private/libc_events.h"
/*
* This code assumes it is running on a processor that supports all arm v7

View File

@ -28,7 +28,7 @@
#include <machine/cpu-features.h>
#include <machine/asm.h>
#include "libc_events.h"
#include "private/libc_events.h"
/*
* This code assumes it is running on a processor that supports all arm v7

View File

@ -59,4 +59,3 @@ void __on_dlclose() {
#ifdef __i386__
# include "../../arch-x86/bionic/__stack_chk_fail_local.h"
#endif

View File

@ -29,7 +29,7 @@
#include <sys/cachectl.h>
#ifdef DEBUG
#include <private/libc_logging.h>
#include "private/libc_logging.h"
#define XLOG(...) __libc_format_log(ANDROID_LOG_DEBUG,"libc-cacheflush",__VA_ARGS__)
#endif

View File

@ -90,5 +90,5 @@ __asm__ (
" .set pop \n"
);
#include "__dso_handle.h"
#include "../../arch-common/bionic/__dso_handle.h"
#include "atexit.h"

View File

@ -34,5 +34,5 @@ void __on_dlclose() {
__cxa_finalize(&__dso_handle);
}
#include "__dso_handle_so.h"
#include "../../arch-common/bionic/__dso_handle_so.h"
#include "atexit.h"

View File

@ -28,7 +28,7 @@
#undef _FORTIFY_SOURCE
#include <sys/select.h>
#include "libc_logging.h"
#include "private/libc_logging.h"
extern "C" int __FD_ISSET_chk(int fd, fd_set* set, size_t set_size) {
if (__predict_false(fd < 0)) {

View File

@ -27,9 +27,10 @@
*/
#include <errno.h>
#include <bionic_tls.h>
#include <stdint.h>
#include "private/bionic_tls.h"
volatile int* __errno() {
return reinterpret_cast<int*>(&(__get_tls()[TLS_SLOT_ERRNO]));
}

View File

@ -28,7 +28,7 @@
#include <stdio.h>
#include <stdlib.h>
#include "libc_logging.h"
#include "private/libc_logging.h"
/*
* __fgets_chk. Called in place of fgets() when we know the

View File

@ -29,7 +29,7 @@
#undef _FORTIFY_SOURCE
#include <string.h>
#include <stdlib.h>
#include "libc_logging.h"
#include "private/libc_logging.h"
/*
* Runtime implementation of __memcpy_chk.

View File

@ -28,7 +28,7 @@
#include <string.h>
#include <stdlib.h>
#include "libc_logging.h"
#include "private/libc_logging.h"
/*
* Runtime implementation of __builtin____memmove_chk.

View File

@ -28,7 +28,7 @@
#include <string.h>
#include <stdlib.h>
#include "libc_logging.h"
#include "private/libc_logging.h"
/*
* Runtime implementation of __builtin____memset_chk.

View File

@ -30,7 +30,7 @@
#include <stddef.h>
#include <sys/socket.h>
#include "libc_logging.h"
#include "private/libc_logging.h"
extern "C"
ssize_t __recvfrom_chk(int socket, void* buf, size_t len, size_t buflen, unsigned int flags,

View File

@ -28,8 +28,8 @@
#include <stdlib.h>
#include "bionic_ssp.h"
#include "libc_logging.h"
#include "private/bionic_ssp.h"
#include "private/libc_logging.h"
void __stack_chk_fail() {
__libc_fatal("stack corruption detected");

View File

@ -28,7 +28,7 @@
#include <string.h>
#include <stdlib.h>
#include "libc_logging.h"
#include "private/libc_logging.h"
/*
* Runtime implementation of __builtin____strcat_chk.

View File

@ -28,7 +28,7 @@
*/
#include <string.h>
#include "libc_logging.h"
#include "private/libc_logging.h"
extern "C" char* __strchr_chk(const char* p, int ch, size_t s_len) {
for (;; ++p, s_len--) {

View File

@ -28,7 +28,7 @@
#include <string.h>
#include <stdlib.h>
#include "libc_logging.h"
#include "private/libc_logging.h"
/*
* Runtime implementation of __builtin____strcpy_chk.

View File

@ -28,7 +28,7 @@
#include <string.h>
#include <stdlib.h>
#include "libc_logging.h"
#include "private/libc_logging.h"
/*
* __strlcat_chk. Called in place of strlcat() when we know the

View File

@ -28,7 +28,7 @@
#include <string.h>
#include <stdlib.h>
#include "libc_logging.h"
#include "private/libc_logging.h"
/*
* __strlcpy_chk. Called in place of strlcpy() when we know the

View File

@ -28,7 +28,7 @@
#include <string.h>
#include <stdlib.h>
#include "libc_logging.h"
#include "private/libc_logging.h"
/*
* Runtime implementation of __strlen_chk.

View File

@ -28,7 +28,7 @@
#include <string.h>
#include <stdlib.h>
#include "libc_logging.h"
#include "private/libc_logging.h"
/*
* Runtime implementation of __builtin____strncat_chk.

View File

@ -28,7 +28,7 @@
#include <string.h>
#include <stdlib.h>
#include "libc_logging.h"
#include "private/libc_logging.h"
/*
* Runtime implementation of __builtin____strncpy_chk.

View File

@ -29,7 +29,7 @@
*/
#include <string.h>
#include "libc_logging.h"
#include "private/libc_logging.h"
extern "C" char* __strrchr_chk(const char *p, int ch, size_t s_len)
{

View File

@ -0,0 +1,57 @@
/*
* 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.
*/
#include <pthread.h>
#include "pthread_internal.h"
#include "private/bionic_tls.h"
// This trampoline is called from the assembly _pthread_clone function.
// Our 'tls' and __pthread_clone's 'child_stack' are one and the same, just growing in
// opposite directions.
extern "C" void __thread_entry(void* (*func)(void*), void* arg, void** tls) {
// Wait for our creating thread to release us. This lets it have time to
// notify gdb about this thread before we start doing anything.
// This also provides the memory barrier needed to ensure that all memory
// accesses previously made by the creating thread are visible to us.
pthread_mutex_t* start_mutex = (pthread_mutex_t*) &tls[TLS_SLOT_SELF];
pthread_mutex_lock(start_mutex);
pthread_mutex_destroy(start_mutex);
pthread_internal_t* thread = (pthread_internal_t*) tls[TLS_SLOT_THREAD_ID];
thread->tls = tls;
__init_tls(thread);
if ((thread->internal_flags & PTHREAD_INTERNAL_FLAG_THREAD_INIT_FAILED) != 0) {
pthread_exit(NULL);
}
void* result = func(arg);
pthread_exit(result);
}

View File

@ -30,9 +30,10 @@
#include <sys/types.h>
#include <sys/stat.h>
#include "libc_logging.h"
#include <stdlib.h>
#include "private/libc_logging.h"
/*
* Runtime implementation of __umask_chk.
*

View File

@ -29,7 +29,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include "libc_logging.h"
#include "private/libc_logging.h"
/*
* Runtime implementation of __builtin____vsnprintf_chk.

View File

@ -29,7 +29,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include "libc_logging.h"
#include "private/libc_logging.h"
/*
* Runtime implementation of __builtin____vsprintf_chk.

View File

@ -41,7 +41,7 @@
#include <sys/types.h>
#include <sys/param.h>
#include <sys/time.h>
#include "thread_private.h"
#include "private/thread_private.h"
/* BIONIC-BEGIN */
/* this lock should protect the global variables in this file */

View File

@ -30,7 +30,7 @@
#include <assert.h>
#include "libc_logging.h"
#include "private/libc_logging.h"
void __assert(const char* file, int line, const char* failed_expression) {
__libc_fatal("%s:%d: assertion \"%s\" failed", file, line, failed_expression);

View File

@ -35,7 +35,7 @@
#include <sys/types.h>
#include "debug_mapinfo.h"
#include "libc_logging.h"
#include "private/libc_logging.h"
/* depends how the system includes define this */
#ifdef HAVE_UNWIND_CONTEXT_STRUCT

View File

@ -27,9 +27,10 @@
*/
#include <unistd.h>
#include "pthread_internal.h"
#include "bionic_pthread.h"
#include "cpuacct.h"
#include "private/bionic_pthread.h"
extern int __fork(void);
int fork(void)

View File

@ -28,8 +28,6 @@
#include "libc_init_common.h"
#include <asm/page.h>
#include <bionic_tls.h>
#include <elf.h>
#include <errno.h>
#include <stddef.h>
@ -44,6 +42,7 @@
#include "atexit.h"
#include "private/bionic_auxv.h"
#include "private/bionic_ssp.h"
#include "private/bionic_tls.h"
#include "private/KernelArgumentBlock.h"
#include "pthread_internal.h"
@ -57,7 +56,7 @@ const char* __progname;
// Declared in <unistd.h>.
char** environ;
// Declared in <private/bionic_ssp.h>.
// Declared in "private/bionic_ssp.h".
uintptr_t __stack_chk_guard = 0;
static size_t get_main_thread_stack_size() {

View File

@ -49,9 +49,10 @@
#include <stdint.h>
#include <elf.h>
#include "atexit.h"
#include "KernelArgumentBlock.h"
#include "libc_init_common.h"
#include <bionic_tls.h>
#include "private/bionic_tls.h"
#include "private/KernelArgumentBlock.h"
extern "C" {
extern void pthread_debug_init(void);

View File

@ -47,11 +47,12 @@
#include <sys/mman.h>
#include "atexit.h"
#include "bionic_tls.h"
#include "KernelArgumentBlock.h"
#include "libc_init_common.h"
#include "pthread_internal.h"
#include "private/bionic_tls.h"
#include "private/KernelArgumentBlock.h"
// Returns the address of the page containing address 'x'.
#define PAGE_START(x) ((x) & PAGE_MASK)

View File

@ -26,8 +26,8 @@
* SUCH DAMAGE.
*/
#include <../private/libc_logging.h> // Relative path so we can #include this .cpp file for testing.
#include <../private/ScopedPthreadMutexLocker.h>
#include "../private/libc_logging.h" // Relative path so we can #include this .cpp file for testing.
#include "../private/ScopedPthreadMutexLocker.h"
#include <assert.h>
#include <errno.h>

View File

@ -34,7 +34,7 @@
#include <sys/cdefs.h>
#include <sys/param.h>
#include "ThreadLocalBuffer.h"
#include "private/ThreadLocalBuffer.h"
GLOBAL_INIT_THREAD_LOCAL_BUFFER(basename);
GLOBAL_INIT_THREAD_LOCAL_BUFFER(dirname);

View File

@ -48,9 +48,9 @@
#include "debug_mapinfo.h"
#include "debug_stacktrace.h"
#include "dlmalloc.h"
#include "libc_logging.h"
#include "private/libc_logging.h"
#include "malloc_debug_common.h"
#include "ScopedPthreadMutexLocker.h"
#include "private/ScopedPthreadMutexLocker.h"
/* libc.debug.malloc.backlog */
extern unsigned int gMallocDebugBacklog;

View File

@ -47,7 +47,7 @@
#include <unistd.h>
#include "dlmalloc.h"
#include "ScopedPthreadMutexLocker.h"
#include "private/ScopedPthreadMutexLocker.h"
/*
* In a VM process, this is set to 1 after fork()ing out of zygote.
@ -250,7 +250,7 @@ extern "C" size_t malloc_usable_size(const void* mem) {
#include <sys/system_properties.h>
#include <dlfcn.h>
#include <stdio.h>
#include "libc_logging.h"
#include "private/libc_logging.h"
/* Table for dispatching malloc calls, depending on environment. */
static MallocDebug gMallocUse __attribute__((aligned(32))) = {

View File

@ -35,7 +35,7 @@
#include <stdlib.h>
#include "libc_logging.h"
#include "private/libc_logging.h"
#define HASHTABLE_SIZE 1543
#define BACKTRACE_SIZE 32

View File

@ -47,9 +47,10 @@
#include "debug_stacktrace.h"
#include "dlmalloc.h"
#include "libc_logging.h"
#include "malloc_debug_common.h"
#include "ScopedPthreadMutexLocker.h"
#include "private/libc_logging.h"
#include "private/ScopedPthreadMutexLocker.h"
// This file should be included into the build only when
// MALLOC_LEAK_CHECK, or MALLOC_QEMU_INSTRUMENT, or both

View File

@ -51,7 +51,7 @@
#include <unistd.h>
#include <errno.h>
#include "dlmalloc.h"
#include "libc_logging.h"
#include "private/libc_logging.h"
#include "malloc_debug_common.h"
/* This file should be included into the build only when

View File

@ -29,7 +29,7 @@
#include <fcntl.h>
#include <stdarg.h>
#include <stdlib.h>
#include "libc_logging.h"
#include "private/libc_logging.h"
extern int __open(const char*, int, int);

View File

@ -29,7 +29,7 @@
#include <fcntl.h>
#include <stdarg.h>
#include <stdlib.h>
#include "libc_logging.h"
#include "private/libc_logging.h"
extern int __openat(int, const char*, int, int);

View File

@ -34,12 +34,13 @@
#include <sys/mman.h>
#include <unistd.h>
#include "bionic_atomic_inline.h"
#include "bionic_futex.h"
#include "bionic_pthread.h"
#include "bionic_tls.h"
#include "pthread_internal.h"
#include "thread_private.h"
#include "private/bionic_atomic_inline.h"
#include "private/bionic_futex.h"
#include "private/bionic_pthread.h"
#include "private/bionic_tls.h"
#include "private/thread_private.h"
extern void pthread_debug_mutex_lock_check(pthread_mutex_t *mutex);
extern void pthread_debug_mutex_unlock_check(pthread_mutex_t *mutex);

View File

@ -52,8 +52,6 @@ extern "C" void ATTRIBUTES _thread_created_hook(pid_t thread_id);
extern "C" int __set_tls(void* ptr);
static const int kPthreadInitFailed = 1;
static pthread_mutex_t gPthreadStackCreationLock = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t gDebuggerNotificationLock = PTHREAD_MUTEX_INITIALIZER;
@ -84,30 +82,6 @@ void __init_tls(pthread_internal_t* thread) {
}
}
// This trampoline is called from the assembly _pthread_clone function.
// Our 'tls' and __pthread_clone's 'child_stack' are one and the same, just growing in
// opposite directions.
extern "C" void __thread_entry(void* (*func)(void*), void* arg, void** tls) {
// Wait for our creating thread to release us. This lets it have time to
// notify gdb about this thread before we start doing anything.
// This also provides the memory barrier needed to ensure that all memory
// accesses previously made by the creating thread are visible to us.
pthread_mutex_t* start_mutex = (pthread_mutex_t*) &tls[TLS_SLOT_SELF];
pthread_mutex_lock(start_mutex);
pthread_mutex_destroy(start_mutex);
pthread_internal_t* thread = (pthread_internal_t*) tls[TLS_SLOT_THREAD_ID];
thread->tls = tls;
__init_tls(thread);
if ((thread->internal_flags & kPthreadInitFailed) != 0) {
pthread_exit(NULL);
}
void* result = func(arg);
pthread_exit(result);
}
__LIBC_ABI_PRIVATE__
int _init_thread(pthread_internal_t* thread, bool add_to_thread_list) {
int error = 0;
@ -240,7 +214,7 @@ int pthread_create(pthread_t* thread_out, pthread_attr_t const* attr,
if (init_errno != 0) {
// Mark the thread detached and let its __thread_entry run to
// completion. (It'll just exit immediately, cleaning up its resources.)
thread->internal_flags |= kPthreadInitFailed;
thread->internal_flags |= PTHREAD_INTERNAL_FLAG_THREAD_INIT_FAILED;
thread->attr.flags |= PTHREAD_ATTR_FLAG_DETACHED;
return init_errno;
}

View File

@ -31,7 +31,6 @@
#include <sys/system_properties.h>
#include <sys/mman.h>
//#include <dlfcn.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
@ -40,10 +39,10 @@
#include <unwind.h>
#include <unistd.h>
#include "bionic_tls.h"
#include "private/bionic_tls.h"
#include "debug_mapinfo.h"
#include "debug_stacktrace.h"
#include "libc_logging.h"
#include "private/libc_logging.h"
/*
* ===========================================================================

View File

@ -28,7 +28,7 @@
#include <errno.h>
#include "ErrnoRestorer.h"
#include "private/ErrnoRestorer.h"
#include "pthread_accessor.h"
int pthread_getschedparam(pthread_t t, int* policy, sched_param* param) {

View File

@ -77,6 +77,8 @@ __LIBC_HIDDEN__ void _pthread_internal_remove_locked(pthread_internal_t* thread)
/* Has the thread already exited but not been joined? */
#define PTHREAD_ATTR_FLAG_ZOMBIE 0x00000008
#define PTHREAD_INTERNAL_FLAG_THREAD_INIT_FAILED 1
/*
* Traditionally we give threads a 1MiB stack. When we started
* allocating per-thread alternate signal stacks to ease debugging of

View File

@ -28,8 +28,8 @@
#include "pthread_internal.h"
#include "bionic_tls.h"
#include "ScopedPthreadMutexLocker.h"
#include "private/bionic_tls.h"
#include "private/ScopedPthreadMutexLocker.h"
__LIBC_HIDDEN__ pthread_internal_t* gThreadList = NULL;
__LIBC_HIDDEN__ pthread_mutex_t gThreadListLock = PTHREAD_MUTEX_INITIALIZER;

View File

@ -28,7 +28,7 @@
#include <pthread.h>
#include "bionic_tls.h"
#include "private/bionic_tls.h"
#include "pthread_internal.h"
/* A technical note regarding our thread-local-storage (TLS) implementation:

View File

@ -29,7 +29,7 @@
#include <errno.h>
#include <unistd.h>
#include "ErrnoRestorer.h"
#include "private/ErrnoRestorer.h"
#include "pthread_accessor.h"
extern "C" int tgkill(int tgid, int tid, int sig);

View File

@ -28,7 +28,7 @@
#include <errno.h>
#include "ErrnoRestorer.h"
#include "private/ErrnoRestorer.h"
#include "pthread_accessor.h"
int pthread_setschedparam(pthread_t t, int policy, struct sched_param const* param) {

View File

@ -30,10 +30,11 @@
#include <sys/time.h>
#include <sys/atomics.h>
#include <time.h>
#include <bionic_atomic_inline.h>
#include <bionic_futex.h>
#include <limits.h>
#include "private/bionic_atomic_inline.h"
#include "private/bionic_futex.h"
/* In this implementation, a semaphore contains a
* 31-bit signed value and a 1-bit 'shared' flag
* (for process-sharing purpose).

View File

@ -27,7 +27,7 @@
*/
#include <string.h>
#include "ThreadLocalBuffer.h"
#include "private/ThreadLocalBuffer.h"
extern "C" const char* __strerror_lookup(int);

View File

@ -27,7 +27,7 @@
*/
#include <string.h>
#include "ThreadLocalBuffer.h"
#include "private/ThreadLocalBuffer.h"
extern "C" const char* __strsignal_lookup(int);
extern "C" const char* __strsignal(int, char*, size_t);

View File

@ -26,8 +26,6 @@
* SUCH DAMAGE.
*/
#include <asm/page.h>
#include <bionic_tls.h>
#include <ctype.h>
#include <dirent.h>
#include <errno.h>
@ -40,6 +38,7 @@
#include <time.h>
#include <unistd.h>
#include "private/bionic_tls.h"
#include "private/ScopedReaddir.h"
/* seems to be the default on Linux, per the GLibc sources and my own digging */

View File

@ -50,7 +50,8 @@
#include <sys/_system_properties.h>
#include <sys/atomics.h>
#include <bionic_atomic_inline.h>
#include "private/bionic_atomic_inline.h"
#define ALIGN(x, a) (((x) + (a - 1)) & ~(a - 1))

View File

@ -171,7 +171,7 @@
#undef XLOG
#if DEBUG
# include "libc_logging.h"
# include "private/libc_logging.h"
# define XLOG(...) __libc_format_log(ANDROID_LOG_DEBUG,"libc",__VA_ARGS__)
#include <stdio.h>

View File

@ -119,7 +119,7 @@ __RCSID("$NetBSD: res_send.c,v 1.9 2006/01/24 17:41:25 christos Exp $");
# include <resolv_cache.h>
#endif
#include "libc_logging.h"
#include "private/libc_logging.h"
#ifndef DE_CONST
#define DE_CONST(c,v) v = ((c) ? \

View File

@ -42,7 +42,7 @@
#define DEBUG 0
#if DEBUG
# include "libc_logging.h"
# include "private/libc_logging.h"
# include <unistd.h> /* for gettid() */
# define D(...) __libc_format_log(ANDROID_LOG_DEBUG,"libc", __VA_ARGS__)
#else

View File

@ -567,7 +567,7 @@ __END_DECLS
#endif
#if 0
# include "libc_logging.h"
# include "private/libc_logging.h"
# define XLOG(...) __libc_format_log(ANDROID_LOG_DEBUG,"libc",__VA_ARGS__)
#else
#define XLOG(...) do {} while (0)

View File

@ -1,32 +0,0 @@
/*
* syscommon.h
*
* Common header file for system call stubs
*/
#define __IN_SYS_COMMON
#include <errno.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/syscall.h>
#include <poll.h>
#include <sched.h>
#include <sys/dirent.h>
#include <sys/klog.h>
#include <sys/mman.h>
#include <sys/resource.h>
#include <sys/select.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/times.h>
#include <sys/uio.h>
#include <sys/utime.h>
#include <sys/utsname.h>
#include <sys/vfs.h>
#include <sys/wait.h>
#include <unistd.h>
#ifdef __i386__
# include <sys/vm86.h>
#endif

View File

@ -39,7 +39,7 @@
#include <string.h>
#include "local.h"
#include "glue.h"
#include "thread_private.h"
#include "private/thread_private.h"
int __sdidinit;

View File

@ -35,7 +35,7 @@
#include <string.h>
#include <unistd.h>
#include "atexit.h"
#include "thread_private.h"
#include "private/thread_private.h"
int __atexit_invalid = 1;
struct atexit *__atexit;

View File

@ -33,7 +33,7 @@
#include <stdlib.h>
#include <unistd.h>
#include "atexit.h"
#include "thread_private.h"
#include "private/thread_private.h"
/*
* This variable is zero until a process has created a thread.

View File

@ -38,7 +38,7 @@ static const char sccsid[] = "@(#)strftime.c 5.4 (Berkeley) 3/14/89";
#include "locale.h"
#include <ctype.h>
#include <time64.h>
#include <bionic_time.h> /* for strftime_tz */
#include "private/bionic_time.h" /* for strftime_tz */
/* struct lc_time_T is now defined as strftime_locale
* in <time.h>

View File

@ -19,7 +19,7 @@
#include "namespace.h"
#include <sys/cdefs.h>
#include <arpa_nameser.h>
#include "private/arpa_nameser.h"
#define ISC_FORMAT_PRINTF(a,b) __printflike(a,b)
#define ISC_SOCKLEN_T socklen_t

View File

@ -5,8 +5,9 @@
#include <stddef.h>
#include <sys/atomics.h>
#include <endian.h>
#include <private/bionic_futex.h>
#include <private/bionic_atomic_inline.h>
#include "private/bionic_atomic_inline.h"
#include "private/bionic_futex.h"
// This file contains C++ ABI support functions for one time
// constructors as defined in the "Run-time ABI for the ARM Architecture"

View File

@ -22,9 +22,9 @@
#include <stdlib.h>
#include <bionic/pthread_internal.h>
#include <private/bionic_tls.h>
#include <private/ScopedPthreadMutexLocker.h>
#include <private/ThreadLocalBuffer.h>
#include "private/bionic_tls.h"
#include "private/ScopedPthreadMutexLocker.h"
#include "private/ThreadLocalBuffer.h"
/* This file hijacks the symbols stubbed out in libdl.so. */

View File

@ -40,9 +40,9 @@
#include <unistd.h>
// Private C library headers.
#include <private/bionic_tls.h>
#include <private/KernelArgumentBlock.h>
#include <private/ScopedPthreadMutexLocker.h>
#include "private/bionic_tls.h"
#include "private/KernelArgumentBlock.h"
#include "private/ScopedPthreadMutexLocker.h"
#include "linker.h"
#include "linker_debug.h"

View File

@ -33,7 +33,7 @@
#include <stdlib.h>
#include <unistd.h>
#include <private/KernelArgumentBlock.h>
#include "private/KernelArgumentBlock.h"
static char** _envp;
static bool _AT_SECURE_value = true;