Merge korg/donut into korg/master
This commit is contained in:
commit
e7274663f1
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
*.pyc
|
||||||
|
libc/kernel/original
|
238
libc/Android.mk
238
libc/Android.mk
@ -1,6 +1,9 @@
|
|||||||
LOCAL_PATH:= $(call my-dir)
|
LOCAL_PATH:= $(call my-dir)
|
||||||
|
|
||||||
include $(LOCAL_PATH)/arch-$(TARGET_ARCH)/syscalls.mk
|
include $(LOCAL_PATH)/arch-$(TARGET_ARCH)/syscalls.mk
|
||||||
|
|
||||||
|
# Define the common source files for all the libc instances
|
||||||
|
# =========================================================
|
||||||
libc_common_src_files := \
|
libc_common_src_files := \
|
||||||
$(syscall_src) \
|
$(syscall_src) \
|
||||||
unistd/abort.c \
|
unistd/abort.c \
|
||||||
@ -272,6 +275,8 @@ libc_common_src_files := \
|
|||||||
netbsd/nameser/ns_print.c \
|
netbsd/nameser/ns_print.c \
|
||||||
netbsd/nameser/ns_samedomain.c
|
netbsd/nameser/ns_samedomain.c
|
||||||
|
|
||||||
|
# Architecture specific source files go here
|
||||||
|
# =========================================================
|
||||||
ifeq ($(TARGET_ARCH),arm)
|
ifeq ($(TARGET_ARCH),arm)
|
||||||
libc_common_src_files += \
|
libc_common_src_files += \
|
||||||
bionic/eabi.c \
|
bionic/eabi.c \
|
||||||
@ -301,6 +306,14 @@ libc_common_src_files += \
|
|||||||
bionic/pthread.c.arm \
|
bionic/pthread.c.arm \
|
||||||
bionic/pthread-timers.c.arm \
|
bionic/pthread-timers.c.arm \
|
||||||
bionic/ptrace.c.arm
|
bionic/ptrace.c.arm
|
||||||
|
|
||||||
|
# these are used by the static and dynamic versions of the libc
|
||||||
|
# respectively
|
||||||
|
libc_arch_static_src_files := \
|
||||||
|
arch-arm/bionic/exidx_static.c
|
||||||
|
|
||||||
|
libc_arch_dynamic_src_files := \
|
||||||
|
arch-arm/bionic/exidx_dynamic.c
|
||||||
else # !arm
|
else # !arm
|
||||||
|
|
||||||
ifeq ($(TARGET_ARCH),x86)
|
ifeq ($(TARGET_ARCH),x86)
|
||||||
@ -322,10 +335,17 @@ libc_common_src_files += \
|
|||||||
bionic/pthread.c \
|
bionic/pthread.c \
|
||||||
bionic/pthread-timers.c \
|
bionic/pthread-timers.c \
|
||||||
bionic/ptrace.c
|
bionic/ptrace.c
|
||||||
endif # x86
|
|
||||||
|
|
||||||
|
# this is needed for static versions of libc
|
||||||
|
libc_arch_static_src_files := \
|
||||||
|
arch-x86/bionic/dl_iterate_phdr_static.c
|
||||||
|
|
||||||
|
libc_arch_dynamic_src_files :=
|
||||||
|
endif # x86
|
||||||
endif # !arm
|
endif # !arm
|
||||||
|
|
||||||
|
# Define some common cflags
|
||||||
|
# ========================================================
|
||||||
libc_common_cflags := \
|
libc_common_cflags := \
|
||||||
-DWITH_ERRLIST \
|
-DWITH_ERRLIST \
|
||||||
-DANDROID_CHANGES \
|
-DANDROID_CHANGES \
|
||||||
@ -337,162 +357,158 @@ libc_common_cflags := \
|
|||||||
-DNEED_PSELECT=1 \
|
-DNEED_PSELECT=1 \
|
||||||
-DINET6 \
|
-DINET6 \
|
||||||
-I$(LOCAL_PATH)/private \
|
-I$(LOCAL_PATH)/private \
|
||||||
|
-DUSE_DL_PREFIX
|
||||||
|
|
||||||
ifeq ($(TARGET_BUILD_TYPE),debug)
|
ifeq ($(strip $(DEBUG_BIONIC_LIBC)),true)
|
||||||
libc_common_cflags += -DDEBUG
|
libc_common_cflags += -DDEBUG
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(TARGET_ARCH),arm)
|
ifeq ($(TARGET_ARCH),arm)
|
||||||
libc_common_cflags += -fstrict-aliasing
|
libc_common_cflags += -fstrict-aliasing
|
||||||
endif
|
libc_crt_target_cflags := -mthumb-interwork
|
||||||
|
else # !arm
|
||||||
|
ifeq ($(TARGET_ARCH),x86)
|
||||||
|
libc_crt_target_cflags := -m32
|
||||||
|
endif # x86
|
||||||
|
endif # !arm
|
||||||
|
|
||||||
|
# Define some common includes
|
||||||
|
# ========================================================
|
||||||
libc_common_c_includes := \
|
libc_common_c_includes := \
|
||||||
$(LOCAL_PATH)/stdlib \
|
$(LOCAL_PATH)/stdlib \
|
||||||
$(LOCAL_PATH)/string \
|
$(LOCAL_PATH)/string \
|
||||||
$(LOCAL_PATH)/stdio
|
$(LOCAL_PATH)/stdio
|
||||||
|
|
||||||
# libc_common.a
|
|
||||||
# ========================================================
|
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
# 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
|
||||||
LOCAL_SRC_FILES := $(libc_common_src_files)
|
# executables)
|
||||||
LOCAL_CFLAGS := $(libc_common_cflags) -DUSE_DL_PREFIX
|
# ==========================================================================
|
||||||
LOCAL_C_INCLUDES := $(libc_common_c_includes)
|
|
||||||
|
|
||||||
ifneq ($(TARGET_SIMULATOR),true)
|
|
||||||
ifeq ($(TARGET_ARCH),arm)
|
|
||||||
crtend_target_cflags := -mthumb-interwork
|
|
||||||
else
|
|
||||||
ifeq ($(TARGET_ARCH),x86)
|
|
||||||
crtend_target_cflags := -m32
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
# We rename crtend.o to crtend_android.o to avoid a
|
|
||||||
# name clash between gcc and bionic.
|
|
||||||
GEN := $(TARGET_OUT_STATIC_LIBRARIES)/crtend_android.o
|
|
||||||
$(GEN): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtend.S
|
|
||||||
@mkdir -p $(dir $@)
|
|
||||||
$(TARGET_CC) $(crtend_target_cflags) -o $@ -c $<
|
|
||||||
ALL_GENERATED_SOURCES += $(GEN)
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
# crtbegin_so.o/crtend_so.o
|
|
||||||
# These are needed for building the shared libs.
|
|
||||||
ifneq ($(TARGET_SIMULATOR),true)
|
|
||||||
|
|
||||||
ifeq ($(TARGET_ARCH),x86)
|
ifeq ($(TARGET_ARCH),x86)
|
||||||
|
# we only need begin_so/end_so for x86, since it needs an appropriate .init
|
||||||
crt_begin_end_so_target_cflags := -m32
|
# section in the shared library with a function to call all the entries in
|
||||||
|
# .ctors section. ARM uses init_array, and does not need the function.
|
||||||
GEN := $(TARGET_OUT_STATIC_LIBRARIES)/crtbegin_so.o
|
GEN := $(TARGET_OUT_STATIC_LIBRARIES)/crtbegin_so.o
|
||||||
$(GEN): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin_so.S
|
$(GEN): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin_so.S
|
||||||
@mkdir -p $(dir $@)
|
@mkdir -p $(dir $@)
|
||||||
$(TARGET_CC) $(crt_begin_end_so_target_cflags) -o $@ -c $<
|
$(TARGET_CC) $(libc_crt_target_cflags) -o $@ -c $<
|
||||||
ALL_GENERATED_SOURCES += $(GEN)
|
ALL_GENERATED_SOURCES += $(GEN)
|
||||||
|
|
||||||
GEN := $(TARGET_OUT_STATIC_LIBRARIES)/crtend_so.o
|
GEN := $(TARGET_OUT_STATIC_LIBRARIES)/crtend_so.o
|
||||||
$(GEN): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtend_so.S
|
$(GEN): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtend_so.S
|
||||||
@mkdir -p $(dir $@)
|
@mkdir -p $(dir $@)
|
||||||
$(TARGET_CC) $(crt_begin_end_so_target_cflags) -o $@ -c $<
|
$(TARGET_CC) $(libc_crt_target_cflags) -o $@ -c $<
|
||||||
ALL_GENERATED_SOURCES += $(GEN)
|
ALL_GENERATED_SOURCES += $(GEN)
|
||||||
|
|
||||||
endif # TARGET_ARCH == x86
|
endif # TARGET_ARCH == x86
|
||||||
|
|
||||||
endif # !TARGET_SIMULATOR
|
|
||||||
|
GEN := $(TARGET_OUT_STATIC_LIBRARIES)/crtbegin_static.o
|
||||||
|
$(GEN): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin_static.S
|
||||||
|
@mkdir -p $(dir $@)
|
||||||
|
$(TARGET_CC) $(libc_crt_target_cflags) -o $@ -c $<
|
||||||
|
ALL_GENERATED_SOURCES += $(GEN)
|
||||||
|
|
||||||
|
GEN := $(TARGET_OUT_STATIC_LIBRARIES)/crtbegin_dynamic.o
|
||||||
|
$(GEN): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin_dynamic.S
|
||||||
|
@mkdir -p $(dir $@)
|
||||||
|
$(TARGET_CC) $(libc_crt_target_cflags) -o $@ -c $<
|
||||||
|
ALL_GENERATED_SOURCES += $(GEN)
|
||||||
|
|
||||||
|
|
||||||
|
# We rename crtend.o to crtend_android.o to avoid a
|
||||||
|
# name clash between gcc and bionic.
|
||||||
|
GEN := $(TARGET_OUT_STATIC_LIBRARIES)/crtend_android.o
|
||||||
|
$(GEN): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtend.S
|
||||||
|
@mkdir -p $(dir $@)
|
||||||
|
$(TARGET_CC) $(libc_crt_target_cflags) -o $@ -c $<
|
||||||
|
ALL_GENERATED_SOURCES += $(GEN)
|
||||||
|
|
||||||
|
|
||||||
|
# To enable malloc leak check for statically linked programs, add
|
||||||
|
# "WITH_MALLOC_CHECK_LIBC_A := true" to buildspec.mk
|
||||||
|
WITH_MALLOC_CHECK_LIBC_A := $(strip $(WITH_MALLOC_CHECK_LIBC_A))
|
||||||
|
|
||||||
|
# ========================================================
|
||||||
|
# libc_common.a
|
||||||
|
# ========================================================
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES := $(libc_common_src_files)
|
||||||
|
LOCAL_CFLAGS := $(libc_common_cflags)
|
||||||
|
LOCAL_C_INCLUDES := $(libc_common_c_includes)
|
||||||
LOCAL_MODULE := libc_common
|
LOCAL_MODULE := libc_common
|
||||||
LOCAL_SYSTEM_SHARED_LIBRARIES :=
|
LOCAL_SYSTEM_SHARED_LIBRARIES :=
|
||||||
|
|
||||||
include $(BUILD_STATIC_LIBRARY)
|
include $(BUILD_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
|
||||||
# libc.a
|
|
||||||
# ========================================================
|
# ========================================================
|
||||||
|
# libc_nomalloc.a
|
||||||
|
# ========================================================
|
||||||
|
#
|
||||||
|
# This is a version of the static C library that does not
|
||||||
|
# include malloc. It's useful in situations when calling
|
||||||
|
# the user wants to provide their own malloc implementation,
|
||||||
|
# or wants to explicitly disallow the use of the use of malloc,
|
||||||
|
# like the dynamic loader.
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
include $(LOCAL_PATH)/arch-$(TARGET_ARCH)/syscalls.mk
|
|
||||||
|
|
||||||
# To enable malloc leak check for statically linked programs, add
|
|
||||||
# "WITH_MALLOC_CHECK_LIBC_A := true" to device/buildspec.mk
|
|
||||||
WITH_MALLOC_CHECK_LIBC_A := $(strip $(WITH_MALLOC_CHECK_LIBC_A))
|
|
||||||
|
|
||||||
LOCAL_SRC_FILES := \
|
LOCAL_SRC_FILES := \
|
||||||
$(libc_common_src_files) \
|
$(libc_arch_static_src_files) \
|
||||||
bionic/dlmalloc.c \
|
|
||||||
bionic/libc_init_static.c
|
bionic/libc_init_static.c
|
||||||
|
|
||||||
ifeq ($(WITH_MALLOC_CHECK_LIBC_A),true)
|
LOCAL_C_INCLUDES := $(libc_common_c_includes)
|
||||||
LOCAL_SRC_FILES += bionic/malloc_leak.c.arm
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(TARGET_ARCH),arm)
|
|
||||||
LOCAL_SRC_FILES += \
|
|
||||||
arch-arm/bionic/exidx_static.c
|
|
||||||
|
|
||||||
else # TARGET_ARCH != arm
|
|
||||||
|
|
||||||
ifeq ($(TARGET_ARCH),x86)
|
|
||||||
LOCAL_SRC_FILES += \
|
|
||||||
arch-x86/bionic/dl_iterate_phdr_static.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifneq ($(TARGET_SIMULATOR),true)
|
|
||||||
ifeq ($(TARGET_ARCH),arm)
|
|
||||||
crtbegin_static_target_cflags := -mthumb-interwork
|
|
||||||
else
|
|
||||||
ifeq ($(TARGET_ARCH),x86)
|
|
||||||
crtbegin_static_target_cflags := -m32
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
GEN := $(TARGET_OUT_STATIC_LIBRARIES)/crtbegin_static.o
|
|
||||||
$(GEN): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin_static.S
|
|
||||||
@mkdir -p $(dir $@)
|
|
||||||
$(TARGET_CC) $(crtbegin_static_target_cflags) -o $@ -c $<
|
|
||||||
ALL_GENERATED_SOURCES += $(GEN)
|
|
||||||
endif
|
|
||||||
|
|
||||||
LOCAL_CFLAGS := $(libc_common_cflags)
|
LOCAL_CFLAGS := $(libc_common_cflags)
|
||||||
|
|
||||||
LOCAL_C_INCLUDES := $(libc_common_c_includes)
|
LOCAL_MODULE := libc_nomalloc
|
||||||
|
|
||||||
ifeq ($(WITH_MALLOC_CHECK_LIBC_A),true)
|
|
||||||
LOCAL_CFLAGS += -DUSE_DL_PREFIX -DMALLOC_LEAK_CHECK
|
|
||||||
endif
|
|
||||||
|
|
||||||
LOCAL_WHOLE_STATIC_LIBRARIES := libc_common
|
LOCAL_WHOLE_STATIC_LIBRARIES := libc_common
|
||||||
LOCAL_MODULE:= libc
|
|
||||||
LOCAL_SYSTEM_SHARED_LIBRARIES :=
|
LOCAL_SYSTEM_SHARED_LIBRARIES :=
|
||||||
|
|
||||||
include $(BUILD_STATIC_LIBRARY)
|
include $(BUILD_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
|
||||||
# libc.so
|
|
||||||
# ========================================================
|
# ========================================================
|
||||||
|
# libc.a
|
||||||
|
# ========================================================
|
||||||
include $(CLEAR_VARS)
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES := \
|
||||||
|
$(libc_arch_static_src_files) \
|
||||||
|
bionic/dlmalloc.c \
|
||||||
|
bionic/libc_init_static.c
|
||||||
|
|
||||||
LOCAL_CFLAGS := $(libc_common_cflags)
|
LOCAL_CFLAGS := $(libc_common_cflags)
|
||||||
|
|
||||||
LOCAL_CFLAGS += -DUSE_DL_PREFIX
|
ifeq ($(WITH_MALLOC_CHECK_LIBC_A),true)
|
||||||
|
LOCAL_CFLAGS += -DMALLOC_LEAK_CHECK
|
||||||
|
LOCAL_SRC_FILES += bionic/malloc_leak.c.arm
|
||||||
|
endif
|
||||||
|
|
||||||
LOCAL_C_INCLUDES := $(libc_common_c_includes)
|
LOCAL_C_INCLUDES := $(libc_common_c_includes)
|
||||||
|
|
||||||
|
LOCAL_MODULE := libc
|
||||||
|
LOCAL_WHOLE_STATIC_LIBRARIES := libc_common
|
||||||
|
LOCAL_SYSTEM_SHARED_LIBRARIES :=
|
||||||
|
|
||||||
|
include $(BUILD_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
|
||||||
|
# ========================================================
|
||||||
|
# libc.so
|
||||||
|
# ========================================================
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
LOCAL_CFLAGS := $(libc_common_cflags)
|
||||||
|
LOCAL_C_INCLUDES := $(libc_common_c_includes)
|
||||||
|
|
||||||
LOCAL_SRC_FILES := \
|
LOCAL_SRC_FILES := \
|
||||||
|
$(libc_arch_dynamic_src_files) \
|
||||||
bionic/dlmalloc.c \
|
bionic/dlmalloc.c \
|
||||||
bionic/malloc_leak.c.arm \
|
bionic/malloc_leak.c.arm \
|
||||||
bionic/libc_init_dynamic.c
|
bionic/libc_init_dynamic.c
|
||||||
|
|
||||||
ifeq ($(TARGET_ARCH),arm)
|
|
||||||
LOCAL_SRC_FILES += \
|
|
||||||
arch-arm/bionic/exidx_dynamic.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
LOCAL_MODULE:= libc
|
LOCAL_MODULE:= libc
|
||||||
|
|
||||||
# WARNING: The only library libc.so should depend on is libdl.so! If you add other libraries,
|
# WARNING: The only library libc.so should depend on is libdl.so! If you add other libraries,
|
||||||
@ -507,45 +523,26 @@ LOCAL_SHARED_LIBRARIES := libdl
|
|||||||
LOCAL_WHOLE_STATIC_LIBRARIES := libc_common
|
LOCAL_WHOLE_STATIC_LIBRARIES := libc_common
|
||||||
LOCAL_SYSTEM_SHARED_LIBRARIES :=
|
LOCAL_SYSTEM_SHARED_LIBRARIES :=
|
||||||
|
|
||||||
ifneq ($(TARGET_SIMULATOR),true)
|
|
||||||
ifeq ($(TARGET_ARCH),arm)
|
|
||||||
crtbegin_dynamic_target_cflags := -mthumb-interwork
|
|
||||||
else
|
|
||||||
ifeq ($(TARGET_ARCH),x86)
|
|
||||||
crtbegin_dynamic_target_cflags := -m32
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
GEN := $(TARGET_OUT_STATIC_LIBRARIES)/crtbegin_dynamic.o
|
|
||||||
$(GEN): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin_dynamic.S
|
|
||||||
@mkdir -p $(dir $@)
|
|
||||||
$(TARGET_CC) $(crtbegin_dynamic_target_cflags) -o $@ -c $<
|
|
||||||
ALL_GENERATED_SOURCES += $(GEN)
|
|
||||||
endif
|
|
||||||
|
|
||||||
include $(BUILD_SHARED_LIBRARY)
|
include $(BUILD_SHARED_LIBRARY)
|
||||||
|
|
||||||
|
|
||||||
|
# ========================================================
|
||||||
# libc_debug.so
|
# libc_debug.so
|
||||||
# ========================================================
|
# ========================================================
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
LOCAL_CFLAGS := $(libc_common_cflags)
|
LOCAL_CFLAGS := \
|
||||||
|
$(libc_common_cflags) \
|
||||||
LOCAL_CFLAGS += -DUSE_DL_PREFIX -DMALLOC_LEAK_CHECK
|
-DMALLOC_LEAK_CHECK
|
||||||
|
|
||||||
LOCAL_C_INCLUDES := $(libc_common_c_includes)
|
LOCAL_C_INCLUDES := $(libc_common_c_includes)
|
||||||
|
|
||||||
LOCAL_SRC_FILES := \
|
LOCAL_SRC_FILES := \
|
||||||
|
$(libc_arch_dynamic_src_files) \
|
||||||
bionic/dlmalloc.c \
|
bionic/dlmalloc.c \
|
||||||
bionic/malloc_leak.c.arm \
|
bionic/malloc_leak.c.arm \
|
||||||
bionic/libc_init_dynamic.c
|
bionic/libc_init_dynamic.c
|
||||||
|
|
||||||
ifeq ($(TARGET_ARCH),arm)
|
|
||||||
LOCAL_SRC_FILES += \
|
|
||||||
arch-arm/bionic/exidx_dynamic.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
LOCAL_MODULE:= libc_debug
|
LOCAL_MODULE:= libc_debug
|
||||||
|
|
||||||
# WARNING: The only library libc.so should depend on is libdl.so! If you add other libraries,
|
# WARNING: The only library libc.so should depend on is libdl.so! If you add other libraries,
|
||||||
@ -564,9 +561,6 @@ LOCAL_PRELINK_MODULE := false
|
|||||||
# Don't install on release build
|
# Don't install on release build
|
||||||
LOCAL_MODULE_TAGS := eng
|
LOCAL_MODULE_TAGS := eng
|
||||||
|
|
||||||
GEN := $(TARGET_OUT_STATIC_LIBRARIES)/crtbegin_dynamic.o
|
|
||||||
ALL_GENERATED_SOURCES += $(GEN)
|
|
||||||
|
|
||||||
include $(BUILD_SHARED_LIBRARY)
|
include $(BUILD_SHARED_LIBRARY)
|
||||||
|
|
||||||
# ========================================================
|
# ========================================================
|
||||||
|
@ -28,15 +28,24 @@
|
|||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
extern int __cxa_atexit(void (*)(void*), void*, void* );
|
||||||
|
|
||||||
void* __dso_handle = 0;
|
void* __dso_handle = 0;
|
||||||
|
|
||||||
|
/* The "C++ ABI for ARM" document states that static C++ constructors,
|
||||||
|
* which are called from the .init_array, should manually call
|
||||||
|
* __aeabi_atexit() to register static destructors explicitely.
|
||||||
|
*
|
||||||
|
* Note that 'dso_handle' is the address of a magic linker-generate
|
||||||
|
* variable from the shared object that contains the constructor/destructor
|
||||||
|
*/
|
||||||
|
|
||||||
/* Make this a weak symbol to avoid a multiple definition error when linking
|
/* Make this a weak symbol to avoid a multiple definition error when linking
|
||||||
* with libstdc++-v3. */
|
* with libstdc++-v3. */
|
||||||
int __attribute__((weak))
|
int __attribute__((weak))
|
||||||
__aeabi_atexit (void *object, void (*destructor) (void *), void *dso_handle)
|
__aeabi_atexit (void *object, void (*destructor) (void *), void *dso_handle)
|
||||||
{
|
{
|
||||||
//return __cxa_atexit(destructor, object, dso_handle);
|
return __cxa_atexit(destructor, object, dso_handle);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
20
libc/docs/ISSUES.TXT
Normal file
20
libc/docs/ISSUES.TXT
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
Bionic C Library Issues:
|
||||||
|
========================
|
||||||
|
|
||||||
|
This document lists important known issues of various releases
|
||||||
|
of the Bionic C library. Note that these differ from specific
|
||||||
|
implementation choices that are documented in the OVERVIEW.TXT
|
||||||
|
document.
|
||||||
|
|
||||||
|
Currently known issues:
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
- The C library initialization will improperly run static C++
|
||||||
|
constructors located in shared libraries twice.
|
||||||
|
|
||||||
|
Android-1.5 issues:
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
- getservbyname() returned the port number in the s_port field of
|
||||||
|
the 'struct servent' structure in host-byte-order, instead of
|
||||||
|
network-byte-order.
|
@ -71,6 +71,13 @@ struct stat {
|
|||||||
unsigned long long st_ino;
|
unsigned long long st_ino;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* For compatibility with GLibc, we provide macro aliases
|
||||||
|
* for the non-Posix nano-seconds accessors.
|
||||||
|
*/
|
||||||
|
#define st_atimensec st_atime_nsec
|
||||||
|
#define st_mtimensec st_mtime_nsec
|
||||||
|
#define st_ctimensec st_ctime_nsec
|
||||||
|
|
||||||
extern int chmod(const char *, mode_t);
|
extern int chmod(const char *, mode_t);
|
||||||
extern int fchmod(int, mode_t);
|
extern int fchmod(int, mode_t);
|
||||||
extern int mkdir(const char *, mode_t);
|
extern int mkdir(const char *, mode_t);
|
||||||
|
29
libc/kernel/common/linux/if_pppolac.h
Normal file
29
libc/kernel/common/linux/if_pppolac.h
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
****************************************************************************
|
||||||
|
***
|
||||||
|
*** This header was automatically generated from a Linux kernel header
|
||||||
|
*** of the same name, to make information necessary for userspace to
|
||||||
|
*** call into the kernel available to libc. It contains only constants,
|
||||||
|
*** structures, and macros generated from the original header, and thus,
|
||||||
|
*** contains no copyrightable information.
|
||||||
|
***
|
||||||
|
****************************************************************************
|
||||||
|
****************************************************************************/
|
||||||
|
#ifndef __LINUX_IF_PPPOLAC_H
|
||||||
|
#define __LINUX_IF_PPPOLAC_H
|
||||||
|
|
||||||
|
#include <linux/socket.h>
|
||||||
|
#include <linux/types.h>
|
||||||
|
|
||||||
|
#define PX_PROTO_OLAC 2
|
||||||
|
|
||||||
|
struct sockaddr_pppolac {
|
||||||
|
sa_family_t sa_family;
|
||||||
|
unsigned int sa_protocol;
|
||||||
|
int udp_socket;
|
||||||
|
struct __attribute__((packed)) {
|
||||||
|
__u16 tunnel, session;
|
||||||
|
} local, remote;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
#endif
|
28
libc/kernel/common/linux/if_pppopns.h
Normal file
28
libc/kernel/common/linux/if_pppopns.h
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
****************************************************************************
|
||||||
|
***
|
||||||
|
*** This header was automatically generated from a Linux kernel header
|
||||||
|
*** of the same name, to make information necessary for userspace to
|
||||||
|
*** call into the kernel available to libc. It contains only constants,
|
||||||
|
*** structures, and macros generated from the original header, and thus,
|
||||||
|
*** contains no copyrightable information.
|
||||||
|
***
|
||||||
|
****************************************************************************
|
||||||
|
****************************************************************************/
|
||||||
|
#ifndef __LINUX_IF_PPPOPNS_H
|
||||||
|
#define __LINUX_IF_PPPOPNS_H
|
||||||
|
|
||||||
|
#include <linux/socket.h>
|
||||||
|
#include <linux/types.h>
|
||||||
|
|
||||||
|
#define PX_PROTO_OPNS 3
|
||||||
|
|
||||||
|
struct sockaddr_pppopns {
|
||||||
|
sa_family_t sa_family;
|
||||||
|
unsigned int sa_protocol;
|
||||||
|
int tcp_socket;
|
||||||
|
__u16 local;
|
||||||
|
__u16 remote;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
#endif
|
56
libc/kernel/common/linux/ipsec.h
Normal file
56
libc/kernel/common/linux/ipsec.h
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
****************************************************************************
|
||||||
|
***
|
||||||
|
*** This header was automatically generated from a Linux kernel header
|
||||||
|
*** of the same name, to make information necessary for userspace to
|
||||||
|
*** call into the kernel available to libc. It contains only constants,
|
||||||
|
*** structures, and macros generated from the original header, and thus,
|
||||||
|
*** contains no copyrightable information.
|
||||||
|
***
|
||||||
|
****************************************************************************
|
||||||
|
****************************************************************************/
|
||||||
|
#ifndef _LINUX_IPSEC_H
|
||||||
|
#define _LINUX_IPSEC_H
|
||||||
|
|
||||||
|
#include <linux/pfkeyv2.h>
|
||||||
|
|
||||||
|
#define IPSEC_PORT_ANY 0
|
||||||
|
#define IPSEC_ULPROTO_ANY 255
|
||||||
|
#define IPSEC_PROTO_ANY 255
|
||||||
|
|
||||||
|
enum {
|
||||||
|
IPSEC_MODE_ANY = 0,
|
||||||
|
IPSEC_MODE_TRANSPORT = 1,
|
||||||
|
IPSEC_MODE_TUNNEL = 2,
|
||||||
|
IPSEC_MODE_BEET = 3
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
IPSEC_DIR_ANY = 0,
|
||||||
|
IPSEC_DIR_INBOUND = 1,
|
||||||
|
IPSEC_DIR_OUTBOUND = 2,
|
||||||
|
IPSEC_DIR_FWD = 3,
|
||||||
|
IPSEC_DIR_MAX = 4,
|
||||||
|
IPSEC_DIR_INVALID = 5
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
IPSEC_POLICY_DISCARD = 0,
|
||||||
|
IPSEC_POLICY_NONE = 1,
|
||||||
|
IPSEC_POLICY_IPSEC = 2,
|
||||||
|
IPSEC_POLICY_ENTRUST = 3,
|
||||||
|
IPSEC_POLICY_BYPASS = 4
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
IPSEC_LEVEL_DEFAULT = 0,
|
||||||
|
IPSEC_LEVEL_USE = 1,
|
||||||
|
IPSEC_LEVEL_REQUIRE = 2,
|
||||||
|
IPSEC_LEVEL_UNIQUE = 3
|
||||||
|
};
|
||||||
|
|
||||||
|
#define IPSEC_MANUAL_REQID_MAX 0x3fff
|
||||||
|
|
||||||
|
#define IPSEC_REPLAYWSIZE 32
|
||||||
|
|
||||||
|
#endif
|
@ -14,7 +14,6 @@
|
|||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/ioctl.h>
|
#include <linux/ioctl.h>
|
||||||
#include <asm/sizes.h>
|
|
||||||
|
|
||||||
#define ADSP_IOCTL_MAGIC 'q'
|
#define ADSP_IOCTL_MAGIC 'q'
|
||||||
|
|
||||||
@ -33,11 +32,6 @@ struct adsp_event_t {
|
|||||||
uint8_t *data;
|
uint8_t *data;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct adsp_pmem_info_t {
|
|
||||||
int fd;
|
|
||||||
void *vaddr;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define ADSP_IOCTL_ENABLE _IOR(ADSP_IOCTL_MAGIC, 1, unsigned)
|
#define ADSP_IOCTL_ENABLE _IOR(ADSP_IOCTL_MAGIC, 1, unsigned)
|
||||||
|
|
||||||
#define ADSP_IOCTL_DISABLE _IOR(ADSP_IOCTL_MAGIC, 2, unsigned)
|
#define ADSP_IOCTL_DISABLE _IOR(ADSP_IOCTL_MAGIC, 2, unsigned)
|
||||||
@ -48,10 +42,22 @@ struct adsp_pmem_info_t {
|
|||||||
|
|
||||||
#define ADSP_IOCTL_GET_EVENT _IOWR(ADSP_IOCTL_MAGIC, 5, struct adsp_event_data_t *)
|
#define ADSP_IOCTL_GET_EVENT _IOWR(ADSP_IOCTL_MAGIC, 5, struct adsp_event_data_t *)
|
||||||
|
|
||||||
|
#define ADSP_IOCTL_SET_CLKRATE _IOR(ADSP_IOCTL_MAGIC, 6, unsigned)
|
||||||
|
|
||||||
#define ADSP_IOCTL_DISABLE_EVENT_RSP _IOR(ADSP_IOCTL_MAGIC, 10, unsigned)
|
#define ADSP_IOCTL_DISABLE_EVENT_RSP _IOR(ADSP_IOCTL_MAGIC, 10, unsigned)
|
||||||
|
|
||||||
#define ADSP_IOCTL_REGISTER_PMEM _IOW(ADSP_IOCTL_MAGIC, 13, struct adsp_pmem_info *)
|
struct adsp_pmem_info {
|
||||||
|
int fd;
|
||||||
|
void *vaddr;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define ADSP_IOCTL_REGISTER_PMEM _IOW(ADSP_IOCTL_MAGIC, 13, unsigned)
|
||||||
|
|
||||||
|
#define ADSP_IOCTL_UNREGISTER_PMEM _IOW(ADSP_IOCTL_MAGIC, 14, unsigned)
|
||||||
|
|
||||||
#define ADSP_IOCTL_ABORT_EVENT_READ _IOW(ADSP_IOCTL_MAGIC, 15, unsigned)
|
#define ADSP_IOCTL_ABORT_EVENT_READ _IOW(ADSP_IOCTL_MAGIC, 15, unsigned)
|
||||||
|
|
||||||
|
#define ADSP_IOCTL_LINK_TASK _IOW(ADSP_IOCTL_MAGIC, 16, unsigned)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -82,4 +82,3 @@ struct msm_snd_endpoint {
|
|||||||
#define SND_GET_ENDPOINT _IOWR(SND_IOCTL_MAGIC, 5, struct msm_snd_endpoint *)
|
#define SND_GET_ENDPOINT _IOWR(SND_IOCTL_MAGIC, 5, struct msm_snd_endpoint *)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
356
libc/kernel/common/media/msm_camera.h
Normal file
356
libc/kernel/common/media/msm_camera.h
Normal file
@ -0,0 +1,356 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
****************************************************************************
|
||||||
|
***
|
||||||
|
*** This header was automatically generated from a Linux kernel header
|
||||||
|
*** of the same name, to make information necessary for userspace to
|
||||||
|
*** call into the kernel available to libc. It contains only constants,
|
||||||
|
*** structures, and macros generated from the original header, and thus,
|
||||||
|
*** contains no copyrightable information.
|
||||||
|
***
|
||||||
|
****************************************************************************
|
||||||
|
****************************************************************************/
|
||||||
|
#ifndef __LINUX_MSM_CAMERA_H
|
||||||
|
#define __LINUX_MSM_CAMERA_H
|
||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
#include <asm/sizes.h>
|
||||||
|
#include <linux/ioctl.h>
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_MAGIC 'm'
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_GET_SENSOR_INFO _IOR(MSM_CAM_IOCTL_MAGIC, 1, struct msm_camsensor_info *)
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_REGISTER_PMEM _IOW(MSM_CAM_IOCTL_MAGIC, 2, struct msm_pmem_info *)
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_UNREGISTER_PMEM _IOW(MSM_CAM_IOCTL_MAGIC, 3, unsigned)
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_CTRL_COMMAND _IOW(MSM_CAM_IOCTL_MAGIC, 4, struct msm_ctrl_cmd *)
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_CONFIG_VFE _IOW(MSM_CAM_IOCTL_MAGIC, 5, struct msm_camera_vfe_cfg_cmd *)
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_GET_STATS _IOR(MSM_CAM_IOCTL_MAGIC, 6, struct msm_camera_stats_event_ctrl *)
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_GETFRAME _IOR(MSM_CAM_IOCTL_MAGIC, 7, struct msm_camera_get_frame *)
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_ENABLE_VFE _IOW(MSM_CAM_IOCTL_MAGIC, 8, struct camera_enable_cmd *)
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_CTRL_CMD_DONE _IOW(MSM_CAM_IOCTL_MAGIC, 9, struct camera_cmd *)
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_CONFIG_CMD _IOW(MSM_CAM_IOCTL_MAGIC, 10, struct camera_cmd *)
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_DISABLE_VFE _IOW(MSM_CAM_IOCTL_MAGIC, 11, struct camera_enable_cmd *)
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_PAD_REG_RESET2 _IOW(MSM_CAM_IOCTL_MAGIC, 12, struct camera_enable_cmd *)
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_VFE_APPS_RESET _IOW(MSM_CAM_IOCTL_MAGIC, 13, struct camera_enable_cmd *)
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_RELEASE_FRAME_BUFFER _IOW(MSM_CAM_IOCTL_MAGIC, 14, struct camera_enable_cmd *)
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_RELEASE_STATS_BUFFER _IOW(MSM_CAM_IOCTL_MAGIC, 15, struct msm_stats_buf *)
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_AXI_CONFIG _IOW(MSM_CAM_IOCTL_MAGIC, 16, struct msm_camera_vfe_cfg_cmd *)
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_GET_PICTURE _IOW(MSM_CAM_IOCTL_MAGIC, 17, struct msm_camera_ctrl_cmd *)
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_SET_CROP _IOW(MSM_CAM_IOCTL_MAGIC, 18, struct crop_info *)
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_PICT_PP _IOW(MSM_CAM_IOCTL_MAGIC, 19, uint8_t *)
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_PICT_PP_DONE _IOW(MSM_CAM_IOCTL_MAGIC, 20, struct msm_snapshot_pp_status *)
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_SENSOR_IO_CFG _IOW(MSM_CAM_IOCTL_MAGIC, 21, struct sensor_cfg_data *)
|
||||||
|
|
||||||
|
#define MSM_CAMERA_LED_OFF 0
|
||||||
|
#define MSM_CAMERA_LED_LOW 1
|
||||||
|
#define MSM_CAMERA_LED_HIGH 2
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_FLASH_LED_CFG _IOW(MSM_CAM_IOCTL_MAGIC, 22, unsigned *)
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_UNBLOCK_POLL_FRAME _IO(MSM_CAM_IOCTL_MAGIC, 23)
|
||||||
|
|
||||||
|
#define MSM_CAM_IOCTL_CTRL_COMMAND_2 _IOW(MSM_CAM_IOCTL_MAGIC, 24, struct msm_ctrl_cmd *)
|
||||||
|
|
||||||
|
#define MAX_SENSOR_NUM 3
|
||||||
|
#define MAX_SENSOR_NAME 32
|
||||||
|
|
||||||
|
#define MSM_CAM_CTRL_CMD_DONE 0
|
||||||
|
#define MSM_CAM_SENSOR_VFE_CMD 1
|
||||||
|
|
||||||
|
struct msm_ctrl_cmd {
|
||||||
|
uint16_t type;
|
||||||
|
uint16_t length;
|
||||||
|
void *value;
|
||||||
|
uint16_t status;
|
||||||
|
uint32_t timeout_ms;
|
||||||
|
int resp_fd;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct msm_vfe_evt_msg {
|
||||||
|
unsigned short type;
|
||||||
|
unsigned short msg_id;
|
||||||
|
unsigned int len;
|
||||||
|
void *data;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define MSM_CAM_RESP_CTRL 0
|
||||||
|
#define MSM_CAM_RESP_STAT_EVT_MSG 1
|
||||||
|
#define MSM_CAM_RESP_V4L2 2
|
||||||
|
#define MSM_CAM_RESP_MAX 3
|
||||||
|
|
||||||
|
struct msm_stats_event_ctrl {
|
||||||
|
|
||||||
|
int resptype;
|
||||||
|
int timeout_ms;
|
||||||
|
struct msm_ctrl_cmd ctrl_cmd;
|
||||||
|
|
||||||
|
struct msm_vfe_evt_msg stats_event;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct msm_camera_cfg_cmd {
|
||||||
|
|
||||||
|
uint16_t cfg_type;
|
||||||
|
|
||||||
|
uint16_t cmd_type;
|
||||||
|
uint16_t queue;
|
||||||
|
uint16_t length;
|
||||||
|
void *value;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CMD_GENERAL 0
|
||||||
|
#define CMD_AXI_CFG_OUT1 1
|
||||||
|
#define CMD_AXI_CFG_SNAP_O1_AND_O2 2
|
||||||
|
#define CMD_AXI_CFG_OUT2 3
|
||||||
|
#define CMD_PICT_T_AXI_CFG 4
|
||||||
|
#define CMD_PICT_M_AXI_CFG 5
|
||||||
|
#define CMD_RAW_PICT_AXI_CFG 6
|
||||||
|
#define CMD_STATS_AXI_CFG 7
|
||||||
|
#define CMD_STATS_AF_AXI_CFG 8
|
||||||
|
#define CMD_FRAME_BUF_RELEASE 9
|
||||||
|
#define CMD_PREV_BUF_CFG 10
|
||||||
|
#define CMD_SNAP_BUF_RELEASE 11
|
||||||
|
#define CMD_SNAP_BUF_CFG 12
|
||||||
|
#define CMD_STATS_DISABLE 13
|
||||||
|
#define CMD_STATS_ENABLE 14
|
||||||
|
#define CMD_STATS_AF_ENABLE 15
|
||||||
|
#define CMD_STATS_BUF_RELEASE 16
|
||||||
|
#define CMD_STATS_AF_BUF_RELEASE 17
|
||||||
|
#define UPDATE_STATS_INVALID 18
|
||||||
|
|
||||||
|
struct msm_vfe_cfg_cmd {
|
||||||
|
int cmd_type;
|
||||||
|
uint16_t length;
|
||||||
|
void *value;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define MAX_CAMERA_ENABLE_NAME_LEN 32
|
||||||
|
struct camera_enable_cmd {
|
||||||
|
char name[MAX_CAMERA_ENABLE_NAME_LEN];
|
||||||
|
};
|
||||||
|
|
||||||
|
#define MSM_PMEM_OUTPUT1 0
|
||||||
|
#define MSM_PMEM_OUTPUT2 1
|
||||||
|
#define MSM_PMEM_OUTPUT1_OUTPUT2 2
|
||||||
|
#define MSM_PMEM_THUMBAIL 3
|
||||||
|
#define MSM_PMEM_MAINIMG 4
|
||||||
|
#define MSM_PMEM_RAW_MAINIMG 5
|
||||||
|
#define MSM_PMEM_AEC_AWB 6
|
||||||
|
#define MSM_PMEM_AF 7
|
||||||
|
#define MSM_PMEM_MAX 8
|
||||||
|
|
||||||
|
#define FRAME_PREVIEW_OUTPUT1 0
|
||||||
|
#define FRAME_PREVIEW_OUTPUT2 1
|
||||||
|
#define FRAME_SNAPSHOT 2
|
||||||
|
#define FRAME_THUMBAIL 3
|
||||||
|
#define FRAME_RAW_SNAPSHOT 4
|
||||||
|
#define FRAME_MAX 5
|
||||||
|
|
||||||
|
struct msm_pmem_info {
|
||||||
|
int type;
|
||||||
|
int fd;
|
||||||
|
void *vaddr;
|
||||||
|
uint32_t offset;
|
||||||
|
uint32_t len;
|
||||||
|
uint32_t y_off;
|
||||||
|
uint32_t cbcr_off;
|
||||||
|
uint8_t active;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct outputCfg {
|
||||||
|
uint32_t height;
|
||||||
|
uint32_t width;
|
||||||
|
|
||||||
|
uint32_t window_height_firstline;
|
||||||
|
uint32_t window_height_lastline;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define OUTPUT_1 0
|
||||||
|
#define OUTPUT_2 1
|
||||||
|
#define OUTPUT_1_AND_2 2
|
||||||
|
#define CAMIF_TO_AXI_VIA_OUTPUT_2 3
|
||||||
|
#define OUTPUT_1_AND_CAMIF_TO_AXI_VIA_OUTPUT_2 4
|
||||||
|
#define OUTPUT_2_AND_CAMIF_TO_AXI_VIA_OUTPUT_1 5
|
||||||
|
#define LAST_AXI_OUTPUT_MODE_ENUM = OUTPUT_2_AND_CAMIF_TO_AXI_VIA_OUTPUT_1 6
|
||||||
|
|
||||||
|
#define MSM_FRAME_PREV_1 0
|
||||||
|
#define MSM_FRAME_PREV_2 1
|
||||||
|
#define MSM_FRAME_ENC 2
|
||||||
|
|
||||||
|
struct msm_frame {
|
||||||
|
int path;
|
||||||
|
unsigned long buffer;
|
||||||
|
uint32_t y_off;
|
||||||
|
uint32_t cbcr_off;
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
void *cropinfo;
|
||||||
|
int croplen;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define STAT_AEAW 0
|
||||||
|
#define STAT_AF 1
|
||||||
|
#define STAT_MAX 2
|
||||||
|
|
||||||
|
struct msm_stats_buf {
|
||||||
|
int type;
|
||||||
|
unsigned long buffer;
|
||||||
|
int fd;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define MSM_V4L2_VID_CAP_TYPE 0
|
||||||
|
#define MSM_V4L2_STREAM_ON 1
|
||||||
|
#define MSM_V4L2_STREAM_OFF 2
|
||||||
|
#define MSM_V4L2_SNAPSHOT 3
|
||||||
|
#define MSM_V4L2_QUERY_CTRL 4
|
||||||
|
#define MSM_V4L2_GET_CTRL 5
|
||||||
|
#define MSM_V4L2_SET_CTRL 6
|
||||||
|
#define MSM_V4L2_QUERY 7
|
||||||
|
#define MSM_V4L2_MAX 8
|
||||||
|
|
||||||
|
struct crop_info {
|
||||||
|
void *info;
|
||||||
|
int len;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct msm_postproc {
|
||||||
|
int ftnum;
|
||||||
|
struct msm_frame fthumnail;
|
||||||
|
int fmnum;
|
||||||
|
struct msm_frame fmain;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct msm_snapshot_pp_status {
|
||||||
|
void *status;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CFG_SET_MODE 0
|
||||||
|
#define CFG_SET_EFFECT 1
|
||||||
|
#define CFG_START 2
|
||||||
|
#define CFG_PWR_UP 3
|
||||||
|
#define CFG_PWR_DOWN 4
|
||||||
|
#define CFG_WRITE_EXPOSURE_GAIN 5
|
||||||
|
#define CFG_SET_DEFAULT_FOCUS 6
|
||||||
|
#define CFG_MOVE_FOCUS 7
|
||||||
|
#define CFG_REGISTER_TO_REAL_GAIN 8
|
||||||
|
#define CFG_REAL_TO_REGISTER_GAIN 9
|
||||||
|
#define CFG_SET_FPS 10
|
||||||
|
#define CFG_SET_PICT_FPS 11
|
||||||
|
#define CFG_SET_BRIGHTNESS 12
|
||||||
|
#define CFG_SET_CONTRAST 13
|
||||||
|
#define CFG_SET_ZOOM 14
|
||||||
|
#define CFG_SET_EXPOSURE_MODE 15
|
||||||
|
#define CFG_SET_WB 16
|
||||||
|
#define CFG_SET_ANTIBANDING 17
|
||||||
|
#define CFG_SET_EXP_GAIN 18
|
||||||
|
#define CFG_SET_PICT_EXP_GAIN 19
|
||||||
|
#define CFG_SET_LENS_SHADING 20
|
||||||
|
#define CFG_GET_PICT_FPS 21
|
||||||
|
#define CFG_GET_PREV_L_PF 22
|
||||||
|
#define CFG_GET_PREV_P_PL 23
|
||||||
|
#define CFG_GET_PICT_L_PF 24
|
||||||
|
#define CFG_GET_PICT_P_PL 25
|
||||||
|
#define CFG_GET_AF_MAX_STEPS 26
|
||||||
|
#define CFG_GET_PICT_MAX_EXP_LC 27
|
||||||
|
#define CFG_MAX 28
|
||||||
|
|
||||||
|
#define MOVE_NEAR 0
|
||||||
|
#define MOVE_FAR 1
|
||||||
|
|
||||||
|
#define SENSOR_PREVIEW_MODE 0
|
||||||
|
#define SENSOR_SNAPSHOT_MODE 1
|
||||||
|
#define SENSOR_RAW_SNAPSHOT_MODE 2
|
||||||
|
|
||||||
|
#define SENSOR_QTR_SIZE 0
|
||||||
|
#define SENSOR_FULL_SIZE 1
|
||||||
|
#define SENSOR_INVALID_SIZE 2
|
||||||
|
|
||||||
|
#define CAMERA_EFFECT_OFF 0
|
||||||
|
#define CAMERA_EFFECT_MONO 1
|
||||||
|
#define CAMERA_EFFECT_NEGATIVE 2
|
||||||
|
#define CAMERA_EFFECT_SOLARIZE 3
|
||||||
|
#define CAMERA_EFFECT_PASTEL 4
|
||||||
|
#define CAMERA_EFFECT_MOSAIC 5
|
||||||
|
#define CAMERA_EFFECT_RESIZE 6
|
||||||
|
#define CAMERA_EFFECT_SEPIA 7
|
||||||
|
#define CAMERA_EFFECT_POSTERIZE 8
|
||||||
|
#define CAMERA_EFFECT_WHITEBOARD 9
|
||||||
|
#define CAMERA_EFFECT_BLACKBOARD 10
|
||||||
|
#define CAMERA_EFFECT_AQUA 11
|
||||||
|
#define CAMERA_EFFECT_MAX 12
|
||||||
|
|
||||||
|
struct sensor_pict_fps {
|
||||||
|
uint16_t prevfps;
|
||||||
|
uint16_t pictfps;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct exp_gain_cfg {
|
||||||
|
uint16_t gain;
|
||||||
|
uint32_t line;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct focus_cfg {
|
||||||
|
int32_t steps;
|
||||||
|
int dir;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct fps_cfg {
|
||||||
|
uint16_t f_mult;
|
||||||
|
uint16_t fps_div;
|
||||||
|
uint32_t pict_fps_div;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct sensor_cfg_data {
|
||||||
|
int cfgtype;
|
||||||
|
int mode;
|
||||||
|
int rs;
|
||||||
|
uint8_t max_steps;
|
||||||
|
|
||||||
|
union {
|
||||||
|
int8_t effect;
|
||||||
|
uint8_t lens_shading;
|
||||||
|
uint16_t prevl_pf;
|
||||||
|
uint16_t prevp_pl;
|
||||||
|
uint16_t pictl_pf;
|
||||||
|
uint16_t pictp_pl;
|
||||||
|
uint32_t pict_max_exp_lc;
|
||||||
|
uint16_t p_fps;
|
||||||
|
struct sensor_pict_fps gfps;
|
||||||
|
struct exp_gain_cfg exp_gain;
|
||||||
|
struct focus_cfg focus;
|
||||||
|
struct fps_cfg fps;
|
||||||
|
} cfg;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GET_NAME 0
|
||||||
|
#define GET_PREVIEW_LINE_PER_FRAME 1
|
||||||
|
#define GET_PREVIEW_PIXELS_PER_LINE 2
|
||||||
|
#define GET_SNAPSHOT_LINE_PER_FRAME 3
|
||||||
|
#define GET_SNAPSHOT_PIXELS_PER_LINE 4
|
||||||
|
#define GET_SNAPSHOT_FPS 5
|
||||||
|
#define GET_SNAPSHOT_MAX_EP_LINE_CNT 6
|
||||||
|
|
||||||
|
struct msm_camsensor_info {
|
||||||
|
char name[MAX_SENSOR_NAME];
|
||||||
|
uint8_t flash_enabled;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
@ -73,7 +73,9 @@ for path in sources:
|
|||||||
|
|
||||||
print "cleaning: %-*s -> %-*s (%s)" % ( 35, path, 35, dst_path, r )
|
print "cleaning: %-*s -> %-*s (%s)" % ( 35, path, 35, dst_path, r )
|
||||||
|
|
||||||
usePerforce = os.environ.has_key("ANDROID_PRODUCT_OUT")
|
# We don't use Perforce anymore, but just in case, define ANDROID_USE_P4
|
||||||
|
# in your environment if you think you need it.
|
||||||
|
usePerforce = os.environ.has_key("ANDROID_USE_P4")
|
||||||
|
|
||||||
if usePerforce:
|
if usePerforce:
|
||||||
b.updateP4Files()
|
b.updateP4Files()
|
||||||
|
@ -912,7 +912,11 @@ get_port(const struct addrinfo *ai, const char *servname, int matchonly)
|
|||||||
allownumeric = 1;
|
allownumeric = 1;
|
||||||
break;
|
break;
|
||||||
case ANY:
|
case ANY:
|
||||||
|
#if 1 /* ANDROID-SPECIFIC CHANGE TO MATCH GLIBC */
|
||||||
|
allownumeric = 1;
|
||||||
|
#else
|
||||||
allownumeric = 0;
|
allownumeric = 0;
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return EAI_SOCKTYPE;
|
return EAI_SOCKTYPE;
|
||||||
@ -1271,7 +1275,7 @@ _dns_getaddrinfo(void *rv, void *cb_data, va_list ap)
|
|||||||
name = va_arg(ap, char *);
|
name = va_arg(ap, char *);
|
||||||
pai = va_arg(ap, const struct addrinfo *);
|
pai = va_arg(ap, const struct addrinfo *);
|
||||||
|
|
||||||
fprintf(stderr, "_dns_getaddrinfo() name = '%s'\n", name);
|
//fprintf(stderr, "_dns_getaddrinfo() name = '%s'\n", name);
|
||||||
|
|
||||||
memset(&q, 0, sizeof(q));
|
memset(&q, 0, sizeof(q));
|
||||||
memset(&q2, 0, sizeof(q2));
|
memset(&q2, 0, sizeof(q2));
|
||||||
@ -1630,7 +1634,7 @@ res_searchN(const char *name, struct res_target *target, res_state res)
|
|||||||
trailing_dot++;
|
trailing_dot++;
|
||||||
|
|
||||||
|
|
||||||
fprintf(stderr, "res_searchN() name = '%s'\n", name);
|
//fprintf(stderr, "res_searchN() name = '%s'\n", name);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* if there aren't any dots, it could be a user-level alias
|
* if there aren't any dots, it could be a user-level alias
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
*/
|
*/
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#include <sys/endian.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#include "servent.h"
|
#include "servent.h"
|
||||||
#include "services.h"
|
#include "services.h"
|
||||||
@ -54,6 +55,7 @@ getservent_r( res_static rs )
|
|||||||
int namelen;
|
int namelen;
|
||||||
int nn,count;
|
int nn,count;
|
||||||
int total = 0;
|
int total = 0;
|
||||||
|
int port;
|
||||||
char* p2;
|
char* p2;
|
||||||
|
|
||||||
p = rs->servent_ptr;
|
p = rs->servent_ptr;
|
||||||
@ -92,9 +94,12 @@ getservent_r( res_static rs )
|
|||||||
memcpy( rs->servent.s_name, p+1, namelen );
|
memcpy( rs->servent.s_name, p+1, namelen );
|
||||||
rs->servent.s_name[namelen] = 0;
|
rs->servent.s_name[namelen] = 0;
|
||||||
p += 1 + namelen;
|
p += 1 + namelen;
|
||||||
rs->servent.s_port = ((((unsigned char*)p)[0] << 8) |
|
|
||||||
|
/* s_port must be in network byte order */
|
||||||
|
port = ((((unsigned char*)p)[0] << 8) |
|
||||||
((unsigned char*)p)[1]);
|
((unsigned char*)p)[1]);
|
||||||
|
|
||||||
|
rs->servent.s_port = htons(port);
|
||||||
rs->servent.s_proto = p[2] == 't' ? "tcp" : "udp";
|
rs->servent.s_proto = p[2] == 't' ? "tcp" : "udp";
|
||||||
p += 4; /* skip port(2) + proto(1) + aliascount(1) */
|
p += 4; /* skip port(2) + proto(1) + aliascount(1) */
|
||||||
|
|
||||||
|
@ -112,6 +112,7 @@ __RCSID("$NetBSD: res_init.c,v 1.8 2006/03/19 03:10:08 christos Exp $");
|
|||||||
#define MAX_DNS_PROPERTIES 8
|
#define MAX_DNS_PROPERTIES 8
|
||||||
#define DNS_PROP_NAME_PREFIX "net.dns"
|
#define DNS_PROP_NAME_PREFIX "net.dns"
|
||||||
#define DNS_CHANGE_PROP_NAME "net.dnschange"
|
#define DNS_CHANGE_PROP_NAME "net.dnschange"
|
||||||
|
#define DNS_SEARCH_PROP_NAME "net.dns.search"
|
||||||
const prop_info *dns_change_prop;
|
const prop_info *dns_change_prop;
|
||||||
int dns_last_change_counter;
|
int dns_last_change_counter;
|
||||||
static int _get_dns_change_count();
|
static int _get_dns_change_count();
|
||||||
@ -168,6 +169,39 @@ res_ninit(res_state statp) {
|
|||||||
return (__res_vinit(statp, 0));
|
return (__res_vinit(statp, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ANDROID_CHANGES
|
||||||
|
int load_domain_search_list(res_state statp) {
|
||||||
|
char propvalue[PROP_VALUE_MAX];
|
||||||
|
register char *cp, **pp;
|
||||||
|
|
||||||
|
if(__system_property_get(DNS_SEARCH_PROP_NAME, propvalue) >= 1) {
|
||||||
|
strlcpy(statp->defdname, propvalue, sizeof(statp->defdname));
|
||||||
|
if ((cp = strchr(statp->defdname, '\n')) != NULL)
|
||||||
|
*cp = '\0';
|
||||||
|
cp = statp->defdname;
|
||||||
|
pp = statp->dnsrch;
|
||||||
|
while ( pp < statp->dnsrch + MAXDNSRCH ) {
|
||||||
|
while (*cp == ' ' || *cp == '\t') /* skip leading white space */
|
||||||
|
cp++;
|
||||||
|
if (*cp == '\0') /* stop if nothing more */
|
||||||
|
break;
|
||||||
|
*pp++ = cp; /* record this search domain */
|
||||||
|
while (*cp) { /* zero-terminate it */
|
||||||
|
if (*cp == ' ' || *cp == '\t') {
|
||||||
|
*cp++ = '\0';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*pp = NULL; /* statp->dnsrch has MAXDNSRCH+1 items */
|
||||||
|
if (pp > statp->dnsrch)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* This function has to be reachable by res_data.c but not publicly. */
|
/* This function has to be reachable by res_data.c but not publicly. */
|
||||||
int
|
int
|
||||||
__res_vinit(res_state statp, int preinit) {
|
__res_vinit(res_state statp, int preinit) {
|
||||||
@ -344,6 +378,9 @@ __res_vinit(res_state statp, int preinit) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Add the domain search list */
|
||||||
|
havesearch = load_domain_search_list(statp);
|
||||||
#else /* IGNORE resolv.conf */
|
#else /* IGNORE resolv.conf */
|
||||||
#define MATCH(line, name) \
|
#define MATCH(line, name) \
|
||||||
(!strncmp(line, name, sizeof(name) - 1) && \
|
(!strncmp(line, name, sizeof(name) - 1) && \
|
||||||
|
@ -147,10 +147,19 @@ __cxa_finalize(void *dso)
|
|||||||
p->fns[n].fn_ptr.cxa_func = NULL;
|
p->fns[n].fn_ptr.cxa_func = NULL;
|
||||||
mprotect(p, pgsize, PROT_READ);
|
mprotect(p, pgsize, PROT_READ);
|
||||||
}
|
}
|
||||||
|
#if ANDROID
|
||||||
|
/* it looks like we should always call the function
|
||||||
|
* with an argument, even if dso is not NULL. Otherwise
|
||||||
|
* static destructors will not be called properly on
|
||||||
|
* the ARM.
|
||||||
|
*/
|
||||||
|
(*fn.fn_ptr.cxa_func)(fn.fn_arg);
|
||||||
|
#else /* !ANDROID */
|
||||||
if (dso != NULL)
|
if (dso != NULL)
|
||||||
(*fn.fn_ptr.cxa_func)(fn.fn_arg);
|
(*fn.fn_ptr.cxa_func)(fn.fn_arg);
|
||||||
else
|
else
|
||||||
(*fn.fn_ptr.std_func)();
|
(*fn.fn_ptr.std_func)();
|
||||||
|
#endif /* !ANDROID */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
39
libstdc++/include/cassert
Normal file
39
libstdc++/include/cassert
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Standard C++ Library wrapper around the C assert.h header file. This file
|
||||||
|
* can be included multiple times with different definition of NDEBUG, hence the
|
||||||
|
* absence of include guards.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BIONIC_LIBSTDCPP_INCLUDE_CASSERT__
|
||||||
|
#define BIONIC_LIBSTDCPP_INCLUDE_CASSERT__
|
||||||
|
#endif
|
||||||
|
#include <assert.h>
|
56
libstdc++/include/cctype
Normal file
56
libstdc++/include/cctype
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BIONIC_LIBSTDCPP_INCLUDE_CCTYPE__
|
||||||
|
#define BIONIC_LIBSTDCPP_INCLUDE_CCTYPE__
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Standard C++ Library wrapper around the C ctype.h header file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
namespace std
|
||||||
|
{
|
||||||
|
using ::isalnum;
|
||||||
|
using ::isalpha;
|
||||||
|
using ::iscntrl;
|
||||||
|
using ::isdigit;
|
||||||
|
using ::isgraph;
|
||||||
|
using ::islower;
|
||||||
|
using ::isprint;
|
||||||
|
using ::ispunct;
|
||||||
|
using ::isspace;
|
||||||
|
using ::isupper;
|
||||||
|
using ::isxdigit;
|
||||||
|
using ::tolower;
|
||||||
|
using ::toupper;
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
|
#endif // BIONIC_LIBSTDCPP_INCLUDE_CCTYPE__
|
39
libstdc++/include/climits
Normal file
39
libstdc++/include/climits
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BIONIC_LIBSTDCPP_INCLUDE_CLIMITS__
|
||||||
|
#define BIONIC_LIBSTDCPP_INCLUDE_CLIMITS__
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Standard C++ Library wrapper around the C limits.h header file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#endif // BIONIC_LIBSTDCPP_INCLUDE_CLIMITS__
|
71
libstdc++/include/cmath
Normal file
71
libstdc++/include/cmath
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BIONIC_LIBSTDCPP_INCLUDE_CMATH__
|
||||||
|
#define BIONIC_LIBSTDCPP_INCLUDE_CMATH__
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Standard C++ Library wrapper around the C time.h header file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
namespace std
|
||||||
|
{
|
||||||
|
// Functions.
|
||||||
|
using ::cos;
|
||||||
|
using ::sin;
|
||||||
|
using ::tan;
|
||||||
|
using ::acos;
|
||||||
|
using ::asin;
|
||||||
|
using ::atan;
|
||||||
|
using ::atan2;
|
||||||
|
|
||||||
|
using ::cosh;
|
||||||
|
using ::sinh;
|
||||||
|
using ::tanh;
|
||||||
|
|
||||||
|
using ::exp;
|
||||||
|
using ::frexp;
|
||||||
|
using ::ldexp;
|
||||||
|
using ::log;
|
||||||
|
using ::log10;
|
||||||
|
using ::modf;
|
||||||
|
|
||||||
|
using ::pow;
|
||||||
|
using ::sqrt;
|
||||||
|
|
||||||
|
using ::ceil;
|
||||||
|
using ::fabs;
|
||||||
|
using ::floor;
|
||||||
|
using ::fmod;
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
|
#endif // BIONIC_LIBSTDCPP_INCLUDE_CMATH__
|
49
libstdc++/include/csetjmp
Normal file
49
libstdc++/include/csetjmp
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BIONIC_LIBSTDCPP_INCLUDE_CSETJMP__
|
||||||
|
#define BIONIC_LIBSTDCPP_INCLUDE_CSETJMP__
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Standard C++ Library wrapper around the C setjmp.h header file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <setjmp.h>
|
||||||
|
|
||||||
|
#ifndef setjmp
|
||||||
|
#define setjmp(env) setjmp (env)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace std
|
||||||
|
{
|
||||||
|
using ::jmp_buf;
|
||||||
|
using ::longjmp;
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
|
#endif // BIONIC_LIBSTDCPP_INCLUDE_CSETJMP__
|
46
libstdc++/include/csignal
Normal file
46
libstdc++/include/csignal
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BIONIC_LIBSTDCPP_INCLUDE_CSIGNAL__
|
||||||
|
#define BIONIC_LIBSTDCPP_INCLUDE_CSIGNAL__
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Standard C++ Library wrapper around the C signal.h header file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
namespace std
|
||||||
|
{
|
||||||
|
using ::sig_atomic_t;
|
||||||
|
using ::signal;
|
||||||
|
using ::raise;
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
|
#endif // BIONIC_LIBSTDCPP_INCLUDE_CSIGNAL__
|
@ -0,0 +1,46 @@
|
|||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BIONIC_LIBSTDCPP_INCLUDE_CSTDDEF__
|
||||||
|
#define BIONIC_LIBSTDCPP_INCLUDE_CSTDDEF__
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Standard C++ Library wrapper around the C stddef.h header file.
|
||||||
|
* The following 2 types are also declared in the 'std' namespace:
|
||||||
|
* . ptrdiff_t
|
||||||
|
* . size_t
|
||||||
|
*/
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
namespace std {
|
||||||
|
using ::ptrdiff_t;
|
||||||
|
using ::size_t;
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
|
#endif // BIONIC_LIBSTDCPP_INCLUDE_CSTDDEF__
|
40
libstdc++/include/cstdint
Normal file
40
libstdc++/include/cstdint
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BIONIC_LIBSTDCPP_INCLUDE_CSTDINT__
|
||||||
|
#define BIONIC_LIBSTDCPP_INCLUDE_CSTDINT__
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Standard C++ Library wrapper around the C stdint.h header file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
|
#endif // BIONIC_LIBSTDCPP_INCLUDE_CSTDINT__
|
92
libstdc++/include/cstdio
Normal file
92
libstdc++/include/cstdio
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BIONIC_LIBSTDCPP_INCLUDE_CSTDIO__
|
||||||
|
#define BIONIC_LIBSTDCPP_INCLUDE_CSTDIO__
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Standard C++ Library wrapper around the C stdio.h header file.
|
||||||
|
*/
|
||||||
|
#include <cstddef>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
namespace std {
|
||||||
|
using ::FILE;
|
||||||
|
using ::fpos_t;
|
||||||
|
|
||||||
|
using ::clearerr;
|
||||||
|
using ::fclose;
|
||||||
|
using ::feof;
|
||||||
|
using ::ferror;
|
||||||
|
using ::fflush;
|
||||||
|
using ::fgetc;
|
||||||
|
using ::fgetpos;
|
||||||
|
using ::fgets;
|
||||||
|
using ::fopen;
|
||||||
|
using ::fprintf;
|
||||||
|
using ::fputc;
|
||||||
|
using ::fputs;
|
||||||
|
using ::fread;
|
||||||
|
using ::freopen;
|
||||||
|
using ::fscanf;
|
||||||
|
using ::fseek;
|
||||||
|
using ::fsetpos;
|
||||||
|
using ::ftell;
|
||||||
|
using ::fwrite;
|
||||||
|
using ::getc;
|
||||||
|
using ::getchar;
|
||||||
|
using ::gets;
|
||||||
|
using ::perror;
|
||||||
|
using ::printf;
|
||||||
|
using ::putc;
|
||||||
|
using ::putchar;
|
||||||
|
using ::puts;
|
||||||
|
using ::remove;
|
||||||
|
using ::rename;
|
||||||
|
using ::rewind;
|
||||||
|
using ::scanf;
|
||||||
|
using ::setbuf;
|
||||||
|
using ::setvbuf;
|
||||||
|
using ::sprintf;
|
||||||
|
using ::sscanf;
|
||||||
|
using ::tmpfile;
|
||||||
|
using ::tmpnam;
|
||||||
|
using ::ungetc;
|
||||||
|
using ::vfprintf;
|
||||||
|
using ::vprintf;
|
||||||
|
using ::vsprintf;
|
||||||
|
|
||||||
|
using ::snprintf;
|
||||||
|
using ::vfscanf;
|
||||||
|
using ::vscanf;
|
||||||
|
using ::vsnprintf;
|
||||||
|
using ::vsscanf;
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
|
#endif // BIONIC_LIBSTDCPP_INCLUDE_CSTDIO__
|
108
libstdc++/include/cstdlib
Normal file
108
libstdc++/include/cstdlib
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BIONIC_LIBSTDCPP_INCLUDE_CSTDLIB__
|
||||||
|
#define BIONIC_LIBSTDCPP_INCLUDE_CSTDLIB__
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Standard C++ Library wrapper around the C stdlib.h header file.
|
||||||
|
*/
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
namespace std {
|
||||||
|
|
||||||
|
using ::exit;
|
||||||
|
using ::abort;
|
||||||
|
using ::atexit;
|
||||||
|
using ::on_exit;
|
||||||
|
|
||||||
|
using ::getenv;
|
||||||
|
using ::putenv;
|
||||||
|
using ::setenv;
|
||||||
|
using ::unsetenv;
|
||||||
|
using ::clearenv;
|
||||||
|
|
||||||
|
using ::mktemp;
|
||||||
|
using ::mkstemp;
|
||||||
|
|
||||||
|
using ::strtol;
|
||||||
|
using ::strtoll;
|
||||||
|
using ::strtoul;
|
||||||
|
using ::strtoull;
|
||||||
|
using ::strtod;
|
||||||
|
using ::strtof;
|
||||||
|
|
||||||
|
using ::atoi;
|
||||||
|
using ::atol;
|
||||||
|
using ::atoll;
|
||||||
|
using ::atof;
|
||||||
|
|
||||||
|
using ::abs;
|
||||||
|
using ::labs;
|
||||||
|
using ::llabs;
|
||||||
|
|
||||||
|
using ::realpath;
|
||||||
|
using ::system;
|
||||||
|
|
||||||
|
using ::bsearch;
|
||||||
|
using ::qsort;
|
||||||
|
|
||||||
|
using ::jrand48;
|
||||||
|
using ::mrand48;
|
||||||
|
using ::nrand48;
|
||||||
|
using ::lrand48;
|
||||||
|
using ::seed48;
|
||||||
|
using ::srand48;
|
||||||
|
|
||||||
|
using ::rand;
|
||||||
|
using ::srand;
|
||||||
|
using ::random;
|
||||||
|
using ::srandom;
|
||||||
|
|
||||||
|
using ::unlockpt;
|
||||||
|
using ::ptsname;
|
||||||
|
using ::ptsname_r;
|
||||||
|
using ::getpt;
|
||||||
|
using ::grantpt;
|
||||||
|
|
||||||
|
using ::div_t;
|
||||||
|
using ::div;
|
||||||
|
using ::ldiv_t;
|
||||||
|
using ::ldiv;
|
||||||
|
using ::lldiv_t;
|
||||||
|
using ::lldiv;
|
||||||
|
|
||||||
|
using ::mblen;
|
||||||
|
using ::mbstowcs;
|
||||||
|
using ::mbtowc;
|
||||||
|
using ::wctomb;
|
||||||
|
using ::wcstombs;
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
|
#endif // BIONIC_LIBSTDCPP_INCLUDE_CSTDLIB__
|
97
libstdc++/include/cstring
Normal file
97
libstdc++/include/cstring
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BIONIC_LIBSTDCPP_INCLUDE_CSTRING__
|
||||||
|
#define BIONIC_LIBSTDCPP_INCLUDE_CSTRING__
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Standard C++ Library wrapper around the C string.h header file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
namespace std
|
||||||
|
{
|
||||||
|
using ::memccpy;
|
||||||
|
using ::memchr;
|
||||||
|
using ::memrchr;
|
||||||
|
using ::memcmp;
|
||||||
|
using ::memcpy;
|
||||||
|
using ::memmove;
|
||||||
|
using ::memset;
|
||||||
|
using ::memmem;
|
||||||
|
// In string.h but not part of the std
|
||||||
|
// using ::memswap;
|
||||||
|
|
||||||
|
using ::index;
|
||||||
|
using ::rindex;
|
||||||
|
using ::strchr;
|
||||||
|
using ::strrchr;
|
||||||
|
|
||||||
|
using ::strlen;
|
||||||
|
using ::strcmp;
|
||||||
|
using ::strcpy;
|
||||||
|
using ::strcat;
|
||||||
|
|
||||||
|
using ::strcasecmp;
|
||||||
|
using ::strncasecmp;
|
||||||
|
using ::strdup;
|
||||||
|
|
||||||
|
using ::strstr;
|
||||||
|
using ::strcasestr;
|
||||||
|
using ::strtok;
|
||||||
|
using ::strtok_r;
|
||||||
|
|
||||||
|
using ::strerror;
|
||||||
|
using ::strerror_r;
|
||||||
|
|
||||||
|
using ::strnlen;
|
||||||
|
using ::strncat;
|
||||||
|
using ::strndup;
|
||||||
|
using ::strncmp;
|
||||||
|
using ::strncpy;
|
||||||
|
|
||||||
|
// In string.h but not part of the std
|
||||||
|
// using ::strlcat;
|
||||||
|
// using ::strlcpy;
|
||||||
|
|
||||||
|
using ::strcspn;
|
||||||
|
using ::strpbrk;
|
||||||
|
using ::strsep;
|
||||||
|
using ::strspn;
|
||||||
|
|
||||||
|
using ::strsignal;
|
||||||
|
|
||||||
|
using ::strcoll;
|
||||||
|
using ::strxfrm;
|
||||||
|
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
|
#endif // BIONIC_LIBSTDCPP_INCLUDE_CSTRING__
|
59
libstdc++/include/ctime
Normal file
59
libstdc++/include/ctime
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BIONIC_LIBSTDCPP_INCLUDE_CTIME__
|
||||||
|
#define BIONIC_LIBSTDCPP_INCLUDE_CTIME__
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Standard C++ Library wrapper around the C time.h header file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
namespace std
|
||||||
|
{
|
||||||
|
// Types.
|
||||||
|
using ::clock_t;
|
||||||
|
using ::time_t;
|
||||||
|
using ::tm;
|
||||||
|
|
||||||
|
// Functions.
|
||||||
|
using ::clock;
|
||||||
|
using ::difftime;
|
||||||
|
using ::mktime;
|
||||||
|
using ::time;
|
||||||
|
using ::asctime;
|
||||||
|
using ::ctime;
|
||||||
|
using ::gmtime;
|
||||||
|
using ::localtime;
|
||||||
|
using ::strftime;
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
|
#endif // BIONIC_LIBSTDCPP_INCLUDE_CTIME__
|
31
libstdc++/include/cwchar_is_not_supported
Normal file
31
libstdc++/include/cwchar_is_not_supported
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* IMPORTANT: cwchar and cwctype are not supported. See comment in
|
||||||
|
* bionic/libc/include/wchar.h */
|
31
libstdc++/include/cwctype_is_not_supported
Normal file
31
libstdc++/include/cwctype_is_not_supported
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* IMPORTANT: cwchar and cwctype are not supported. See comment in
|
||||||
|
* bionic/libc/include/wchar.h */
|
@ -1,11 +1,10 @@
|
|||||||
|
/* -*- c++ -*- */
|
||||||
#ifndef __NEW__
|
#ifndef __NEW__
|
||||||
#define __NEW__
|
#define __NEW__
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <cstddef>
|
||||||
|
|
||||||
namespace std {
|
namespace std {
|
||||||
using ::size_t;
|
|
||||||
|
|
||||||
struct nothrow_t {};
|
struct nothrow_t {};
|
||||||
extern const nothrow_t nothrow;
|
extern const nothrow_t nothrow;
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ endif
|
|||||||
|
|
||||||
LOCAL_MODULE:= linker
|
LOCAL_MODULE:= linker
|
||||||
|
|
||||||
LOCAL_STATIC_LIBRARIES := libcutils libc
|
LOCAL_STATIC_LIBRARIES := libcutils libc_nomalloc
|
||||||
|
|
||||||
#LOCAL_FORCE_STATIC_EXECUTABLE := true # not necessary when not including BUILD_EXECUTABLE
|
#LOCAL_FORCE_STATIC_EXECUTABLE := true # not necessary when not including BUILD_EXECUTABLE
|
||||||
|
|
||||||
|
114
linker/README.TXT
Normal file
114
linker/README.TXT
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
Android Dynamic Linker Design Notes
|
||||||
|
===================================
|
||||||
|
|
||||||
|
Introduction:
|
||||||
|
-------------
|
||||||
|
|
||||||
|
This document provides several notes related to the design of the Android
|
||||||
|
dynamic linker.
|
||||||
|
|
||||||
|
|
||||||
|
Prelinking:
|
||||||
|
-----------
|
||||||
|
|
||||||
|
System libraries in Android are internally prelinked, which means that
|
||||||
|
any internal relocations within them are stripped from the corresponding
|
||||||
|
shared object, in order to reduce size and speed up loading.
|
||||||
|
|
||||||
|
Such libraries can only be loaded at the very specific virtual memory address
|
||||||
|
they have been prelinked to (during the build process). The list of prelinked
|
||||||
|
system libraries and their corresponding virtual memory address is found in
|
||||||
|
the file:
|
||||||
|
|
||||||
|
build/core/prelink-linux-<arch>.map
|
||||||
|
|
||||||
|
It should be updated each time a new system library is added to the
|
||||||
|
system.
|
||||||
|
|
||||||
|
The prelink step happens at build time, and uses the 'soslim' and 'apriori'
|
||||||
|
tools:
|
||||||
|
|
||||||
|
- 'apriori' is the real prelink tool which removes relocations from the
|
||||||
|
shared object, however, it must be given a list of symbols to remove
|
||||||
|
from the file.
|
||||||
|
|
||||||
|
- 'soslim' is used to find symbols in an executable ELF file
|
||||||
|
and generate a list that can be passed to 'apriori'.
|
||||||
|
|
||||||
|
By default, these tools are only used to remove internal symbols from
|
||||||
|
libraries, though they have been designed to allow more aggressive
|
||||||
|
optimizations (e.g. 'global' prelinking and symbol stripping, which
|
||||||
|
prevent replacing individual system libraries though).
|
||||||
|
|
||||||
|
You can disable prelinking at build time by modifying your Android.mk with
|
||||||
|
a line like:
|
||||||
|
|
||||||
|
LOCAL_PRELINK_MODULE := false
|
||||||
|
|
||||||
|
|
||||||
|
Initialization and Termination functions:
|
||||||
|
-----------------------------------------
|
||||||
|
|
||||||
|
The Unix Sys V Binary Interface standard states that an
|
||||||
|
executable can have the following entries in its .dynamic
|
||||||
|
section:
|
||||||
|
|
||||||
|
DT_INIT
|
||||||
|
Points to the address of an initialization function
|
||||||
|
that must be called when the file is loaded.
|
||||||
|
|
||||||
|
DT_INIT_ARRAY
|
||||||
|
Points to an array of function addresses that must be
|
||||||
|
called, in-order, to perform initialization. Some of
|
||||||
|
the entries in the array can be 0 or -1, and should
|
||||||
|
be ignored.
|
||||||
|
|
||||||
|
Note: this is generally stored in a .init_array section
|
||||||
|
|
||||||
|
DT_INIT_ARRAYSZ
|
||||||
|
The size of the DT_INITARRAY, if any
|
||||||
|
|
||||||
|
DT_FINI
|
||||||
|
Points to the address of a finalization function which
|
||||||
|
must be called when the file is unloaded or the process
|
||||||
|
terminated.
|
||||||
|
|
||||||
|
DT_FINI_ARRAY
|
||||||
|
Same as DT_INITARRAY but for finalizers. Note that the
|
||||||
|
functions must be called in reverse-order though
|
||||||
|
|
||||||
|
Note: this is generally stroed in a .fini_array section
|
||||||
|
|
||||||
|
DT_FINI_ARRAYSZ
|
||||||
|
Size of FT_FINIARRAY
|
||||||
|
|
||||||
|
DT_PREINIT_ARRAY
|
||||||
|
An array similar to DT_INIT_ARRAY which must *only* be
|
||||||
|
present in executables, not shared libraries, which contains
|
||||||
|
a list of functions that need to be called before any other
|
||||||
|
initialization function (i.e. DT_INIT and/or DT_INIT_ARRAY)
|
||||||
|
|
||||||
|
Note: this is generally stroed in a .preinit_array section
|
||||||
|
|
||||||
|
DT_PREINIT_ARRAYSZ
|
||||||
|
The size of DT_PREINIT_ARRAY
|
||||||
|
|
||||||
|
If both a DT_INIT and DT_INITARRAY entry are present, the DT_INIT
|
||||||
|
function must be called before the DT_INITARRAY functions.
|
||||||
|
|
||||||
|
Consequently, the DT_FINIARRAY must be parsed in reverse order before
|
||||||
|
the DT_FINI function, if both are available.
|
||||||
|
|
||||||
|
Note that the implementation of static C++ constructors is very
|
||||||
|
much processor dependent, and may use different ELF sections.
|
||||||
|
|
||||||
|
On the ARM (see "C++ ABI for ARM" document), the static constructors
|
||||||
|
must be called explicitely from the DT_INIT_ARRAY, and each one of them
|
||||||
|
shall register a destructor by calling the special __eabi_atexit()
|
||||||
|
function (provided by the C library). The DT_FINI_ARRAY is not used
|
||||||
|
by static C++ destructors.
|
||||||
|
|
||||||
|
On x86, the lists of constructors and destructors are placed in special
|
||||||
|
sections named ".ctors" and ".dtors", and the DT_INIT / DT_FINI functions
|
||||||
|
are in charge of calling them explicitely.
|
||||||
|
|
@ -15,33 +15,41 @@
|
|||||||
*/
|
*/
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include "linker.h"
|
#include "linker.h"
|
||||||
|
|
||||||
/* This file hijacks the symbols stubbed out in libdl.so. */
|
/* This file hijacks the symbols stubbed out in libdl.so. */
|
||||||
|
|
||||||
#define DL_SUCCESS 0
|
#define DL_SUCCESS 0
|
||||||
#define DL_ERR_CANNOT_FIND_LIBRARY 1
|
#define DL_ERR_CANNOT_LOAD_LIBRARY 1
|
||||||
#define DL_ERR_INVALID_LIBRARY_HANDLE 2
|
#define DL_ERR_INVALID_LIBRARY_HANDLE 2
|
||||||
#define DL_ERR_BAD_SYMBOL_NAME 3
|
#define DL_ERR_BAD_SYMBOL_NAME 3
|
||||||
#define DL_ERR_SYMBOL_NOT_FOUND 4
|
#define DL_ERR_SYMBOL_NOT_FOUND 4
|
||||||
#define DL_ERR_SYMBOL_NOT_GLOBAL 5
|
#define DL_ERR_SYMBOL_NOT_GLOBAL 5
|
||||||
|
|
||||||
|
static char dl_err_buf[1024];
|
||||||
|
static const char *dl_err_str;
|
||||||
|
|
||||||
static const char *dl_errors[] = {
|
static const char *dl_errors[] = {
|
||||||
[DL_SUCCESS] = NULL,
|
[DL_ERR_CANNOT_LOAD_LIBRARY] = "Cannot load library",
|
||||||
[DL_ERR_CANNOT_FIND_LIBRARY] = "Cannot find library",
|
|
||||||
[DL_ERR_INVALID_LIBRARY_HANDLE] = "Invalid library handle",
|
[DL_ERR_INVALID_LIBRARY_HANDLE] = "Invalid library handle",
|
||||||
[DL_ERR_BAD_SYMBOL_NAME] = "Invalid symbol name",
|
[DL_ERR_BAD_SYMBOL_NAME] = "Invalid symbol name",
|
||||||
[DL_ERR_SYMBOL_NOT_FOUND] = "Symbol not found",
|
[DL_ERR_SYMBOL_NOT_FOUND] = "Symbol not found",
|
||||||
[DL_ERR_SYMBOL_NOT_GLOBAL] = "Symbol is not global",
|
[DL_ERR_SYMBOL_NOT_GLOBAL] = "Symbol is not global",
|
||||||
};
|
};
|
||||||
|
|
||||||
static int dl_last_err = DL_SUCCESS;
|
|
||||||
|
|
||||||
#define likely(expr) __builtin_expect (expr, 1)
|
#define likely(expr) __builtin_expect (expr, 1)
|
||||||
#define unlikely(expr) __builtin_expect (expr, 0)
|
#define unlikely(expr) __builtin_expect (expr, 0)
|
||||||
|
|
||||||
static pthread_mutex_t dl_lock = PTHREAD_MUTEX_INITIALIZER;
|
static pthread_mutex_t dl_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
|
||||||
|
static void set_dlerror(int err)
|
||||||
|
{
|
||||||
|
snprintf(dl_err_buf, sizeof(dl_err_buf), "%s: %s", dl_errors[err],
|
||||||
|
linker_get_error());
|
||||||
|
dl_err_str = (const char *)&dl_err_buf[0];
|
||||||
|
};
|
||||||
|
|
||||||
void *dlopen(const char *filename, int flag)
|
void *dlopen(const char *filename, int flag)
|
||||||
{
|
{
|
||||||
soinfo *ret;
|
soinfo *ret;
|
||||||
@ -49,7 +57,7 @@ void *dlopen(const char *filename, int flag)
|
|||||||
pthread_mutex_lock(&dl_lock);
|
pthread_mutex_lock(&dl_lock);
|
||||||
ret = find_library(filename);
|
ret = find_library(filename);
|
||||||
if (unlikely(ret == NULL)) {
|
if (unlikely(ret == NULL)) {
|
||||||
dl_last_err = DL_ERR_CANNOT_FIND_LIBRARY;
|
set_dlerror(DL_ERR_CANNOT_LOAD_LIBRARY);
|
||||||
} else {
|
} else {
|
||||||
ret->refcount++;
|
ret->refcount++;
|
||||||
}
|
}
|
||||||
@ -59,9 +67,9 @@ void *dlopen(const char *filename, int flag)
|
|||||||
|
|
||||||
const char *dlerror(void)
|
const char *dlerror(void)
|
||||||
{
|
{
|
||||||
const char *err = dl_errors[dl_last_err];
|
const char *tmp = dl_err_str;
|
||||||
dl_last_err = DL_SUCCESS;
|
dl_err_str = NULL;
|
||||||
return err;
|
return (const char *)tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *dlsym(void *handle, const char *symbol)
|
void *dlsym(void *handle, const char *symbol)
|
||||||
@ -73,11 +81,11 @@ void *dlsym(void *handle, const char *symbol)
|
|||||||
pthread_mutex_lock(&dl_lock);
|
pthread_mutex_lock(&dl_lock);
|
||||||
|
|
||||||
if(unlikely(handle == 0)) {
|
if(unlikely(handle == 0)) {
|
||||||
dl_last_err = DL_ERR_INVALID_LIBRARY_HANDLE;
|
set_dlerror(DL_ERR_INVALID_LIBRARY_HANDLE);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if(unlikely(symbol == 0)) {
|
if(unlikely(symbol == 0)) {
|
||||||
dl_last_err = DL_ERR_BAD_SYMBOL_NAME;
|
set_dlerror(DL_ERR_BAD_SYMBOL_NAME);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -99,9 +107,10 @@ void *dlsym(void *handle, const char *symbol)
|
|||||||
return (void*)ret;
|
return (void*)ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
dl_last_err = DL_ERR_SYMBOL_NOT_GLOBAL;
|
set_dlerror(DL_ERR_SYMBOL_NOT_GLOBAL);
|
||||||
}
|
}
|
||||||
else dl_last_err = DL_ERR_SYMBOL_NOT_FOUND;
|
else
|
||||||
|
set_dlerror(DL_ERR_SYMBOL_NOT_FOUND);
|
||||||
|
|
||||||
err:
|
err:
|
||||||
pthread_mutex_unlock(&dl_lock);
|
pthread_mutex_unlock(&dl_lock);
|
||||||
|
220
linker/linker.c
220
linker/linker.c
@ -51,7 +51,11 @@
|
|||||||
|
|
||||||
#include "ba.h"
|
#include "ba.h"
|
||||||
|
|
||||||
#define SO_MAX 64
|
#define SO_MAX 96
|
||||||
|
|
||||||
|
/* Assume average path length of 64 and max 8 paths */
|
||||||
|
#define LDPATH_BUFSIZE 512
|
||||||
|
#define LDPATH_MAX 8
|
||||||
|
|
||||||
/* >>> IMPORTANT NOTE - READ ME BEFORE MODIFYING <<<
|
/* >>> IMPORTANT NOTE - READ ME BEFORE MODIFYING <<<
|
||||||
*
|
*
|
||||||
@ -66,7 +70,6 @@
|
|||||||
* - should we do anything special for STB_WEAK symbols?
|
* - should we do anything special for STB_WEAK symbols?
|
||||||
* - are we doing everything we should for ARM_COPY relocations?
|
* - are we doing everything we should for ARM_COPY relocations?
|
||||||
* - cleaner error reporting
|
* - cleaner error reporting
|
||||||
* - configuration for paths (LD_LIBRARY_PATH?)
|
|
||||||
* - after linking, set as much stuff as possible to READONLY
|
* - after linking, set as much stuff as possible to READONLY
|
||||||
* and NOEXEC
|
* and NOEXEC
|
||||||
* - linker hardcodes PAGE_SIZE and PAGE_MASK because the kernel
|
* - linker hardcodes PAGE_SIZE and PAGE_MASK because the kernel
|
||||||
@ -89,6 +92,9 @@ static soinfo *freelist = NULL;
|
|||||||
static soinfo *solist = &libdl_info;
|
static soinfo *solist = &libdl_info;
|
||||||
static soinfo *sonext = &libdl_info;
|
static soinfo *sonext = &libdl_info;
|
||||||
|
|
||||||
|
static char ldpaths_buf[LDPATH_BUFSIZE];
|
||||||
|
static const char *ldpaths[LDPATH_MAX + 1];
|
||||||
|
|
||||||
int debug_verbosity;
|
int debug_verbosity;
|
||||||
static int pid;
|
static int pid;
|
||||||
|
|
||||||
@ -104,6 +110,32 @@ unsigned bitmask[4096];
|
|||||||
#define PT_ARM_EXIDX 0x70000001 /* .ARM.exidx segment */
|
#define PT_ARM_EXIDX 0x70000001 /* .ARM.exidx segment */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define HOODLUM(name, ret, ...) \
|
||||||
|
ret name __VA_ARGS__ \
|
||||||
|
{ \
|
||||||
|
char errstr[] = "ERROR: " #name " called from the dynamic linker!\n"; \
|
||||||
|
write(2, errstr, sizeof(errstr)); \
|
||||||
|
abort(); \
|
||||||
|
}
|
||||||
|
HOODLUM(malloc, void *, (size_t size));
|
||||||
|
HOODLUM(free, void, (void *ptr));
|
||||||
|
HOODLUM(realloc, void *, (void *ptr, size_t size));
|
||||||
|
HOODLUM(calloc, void *, (size_t cnt, size_t size));
|
||||||
|
|
||||||
|
static char tmp_err_buf[768];
|
||||||
|
static char __linker_dl_err_buf[768];
|
||||||
|
#define DL_ERR(fmt, x...) \
|
||||||
|
do { \
|
||||||
|
snprintf(__linker_dl_err_buf, sizeof(__linker_dl_err_buf), \
|
||||||
|
"%s[%d]: " fmt, __func__, __LINE__, ##x); \
|
||||||
|
ERROR(fmt, ##x); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
const char *linker_get_error(void)
|
||||||
|
{
|
||||||
|
return (const char *)&__linker_dl_err_buf[0];
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function is an empty stub where GDB locates a breakpoint to get notified
|
* This function is an empty stub where GDB locates a breakpoint to get notified
|
||||||
* about linker activity.
|
* about linker activity.
|
||||||
@ -207,7 +239,7 @@ static soinfo *alloc_info(const char *name)
|
|||||||
soinfo *si;
|
soinfo *si;
|
||||||
|
|
||||||
if(strlen(name) >= SOINFO_NAME_LEN) {
|
if(strlen(name) >= SOINFO_NAME_LEN) {
|
||||||
ERROR("%5d library name %s too long\n", pid, name);
|
DL_ERR("%5d library name %s too long\n", pid, name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -216,7 +248,7 @@ static soinfo *alloc_info(const char *name)
|
|||||||
*/
|
*/
|
||||||
if (!freelist) {
|
if (!freelist) {
|
||||||
if(socount == SO_MAX) {
|
if(socount == SO_MAX) {
|
||||||
ERROR("%5d too many libraries when loading %s\n", pid, name);
|
DL_ERR("%5d too many libraries when loading %s\n", pid, name);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
freelist = sopool + socount++;
|
freelist = sopool + socount++;
|
||||||
@ -252,7 +284,7 @@ static void free_info(soinfo *si)
|
|||||||
}
|
}
|
||||||
if (trav == NULL) {
|
if (trav == NULL) {
|
||||||
/* si was not ni solist */
|
/* si was not ni solist */
|
||||||
ERROR("%5d name %s is not in solist!\n", pid, si->name);
|
DL_ERR("%5d name %s is not in solist!\n", pid, si->name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -477,13 +509,12 @@ static int _open_lib(const char *name)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: Need to add support for initializing the so search path with
|
|
||||||
* LD_LIBRARY_PATH env variable for non-setuid programs. */
|
|
||||||
static int open_library(const char *name)
|
static int open_library(const char *name)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
char buf[512];
|
char buf[512];
|
||||||
const char **path;
|
const char **path;
|
||||||
|
int n;
|
||||||
|
|
||||||
TRACE("[ %5d opening %s ]\n", pid, name);
|
TRACE("[ %5d opening %s ]\n", pid, name);
|
||||||
|
|
||||||
@ -493,8 +524,21 @@ static int open_library(const char *name)
|
|||||||
if ((name[0] == '/') && ((fd = _open_lib(name)) >= 0))
|
if ((name[0] == '/') && ((fd = _open_lib(name)) >= 0))
|
||||||
return fd;
|
return fd;
|
||||||
|
|
||||||
|
for (path = ldpaths; *path; path++) {
|
||||||
|
n = snprintf(buf, sizeof(buf), "%s/%s", *path, name);
|
||||||
|
if (n < 0 || n >= (int)sizeof(buf)) {
|
||||||
|
WARN("Ignoring very long library path: %s/%s\n", *path, name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ((fd = _open_lib(buf)) >= 0)
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
for (path = sopaths; *path; path++) {
|
for (path = sopaths; *path; path++) {
|
||||||
snprintf(buf, sizeof(buf), "%s/%s", *path, name);
|
n = snprintf(buf, sizeof(buf), "%s/%s", *path, name);
|
||||||
|
if (n < 0 || n >= (int)sizeof(buf)) {
|
||||||
|
WARN("Ignoring very long library path: %s/%s\n", *path, name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if ((fd = _open_lib(buf)) >= 0)
|
if ((fd = _open_lib(buf)) >= 0)
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
@ -521,7 +565,7 @@ is_prelinked(int fd, const char *name)
|
|||||||
|
|
||||||
sz = lseek(fd, -sizeof(prelink_info_t), SEEK_END);
|
sz = lseek(fd, -sizeof(prelink_info_t), SEEK_END);
|
||||||
if (sz < 0) {
|
if (sz < 0) {
|
||||||
ERROR("lseek() failed!\n");
|
DL_ERR("lseek() failed!\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -597,7 +641,7 @@ get_lib_extents(int fd, const char *name, void *__hdr, unsigned *total_sz)
|
|||||||
|
|
||||||
TRACE("[ %5d Computing extents for '%s'. ]\n", pid, name);
|
TRACE("[ %5d Computing extents for '%s'. ]\n", pid, name);
|
||||||
if (verify_elf_object(_hdr, name) < 0) {
|
if (verify_elf_object(_hdr, name) < 0) {
|
||||||
ERROR("%5d - %s is not a valid ELF object\n", pid, name);
|
DL_ERR("%5d - %s is not a valid ELF object\n", pid, name);
|
||||||
return (unsigned)-1;
|
return (unsigned)-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -625,7 +669,7 @@ get_lib_extents(int fd, const char *name, void *__hdr, unsigned *total_sz)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((min_vaddr == 0xffffffff) && (max_vaddr == 0)) {
|
if ((min_vaddr == 0xffffffff) && (max_vaddr == 0)) {
|
||||||
ERROR("%5d - No loadable segments found in %s.\n", pid, name);
|
DL_ERR("%5d - No loadable segments found in %s.\n", pid, name);
|
||||||
return (unsigned)-1;
|
return (unsigned)-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -661,13 +705,13 @@ static int reserve_mem_region(soinfo *si)
|
|||||||
void *base = mmap((void *)si->base, si->size, PROT_READ | PROT_EXEC,
|
void *base = mmap((void *)si->base, si->size, PROT_READ | PROT_EXEC,
|
||||||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||||
if (base == MAP_FAILED) {
|
if (base == MAP_FAILED) {
|
||||||
ERROR("%5d can NOT map (%sprelinked) library '%s' at 0x%08x "
|
DL_ERR("%5d can NOT map (%sprelinked) library '%s' at 0x%08x "
|
||||||
"as requested, will try general pool: %d (%s)\n",
|
"as requested, will try general pool: %d (%s)\n",
|
||||||
pid, (si->base ? "" : "non-"), si->name, si->base,
|
pid, (si->base ? "" : "non-"), si->name, si->base,
|
||||||
errno, strerror(errno));
|
errno, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
} else if (base != (void *)si->base) {
|
} else if (base != (void *)si->base) {
|
||||||
ERROR("OOPS: %5d %sprelinked library '%s' mapped at 0x%08x, "
|
DL_ERR("OOPS: %5d %sprelinked library '%s' mapped at 0x%08x, "
|
||||||
"not at 0x%08x\n", pid, (si->base ? "" : "non-"),
|
"not at 0x%08x\n", pid, (si->base ? "" : "non-"),
|
||||||
si->name, (unsigned)base, si->base);
|
si->name, (unsigned)base, si->base);
|
||||||
munmap(base, si->size);
|
munmap(base, si->size);
|
||||||
@ -705,7 +749,7 @@ alloc_mem_region(soinfo *si)
|
|||||||
}
|
}
|
||||||
|
|
||||||
err:
|
err:
|
||||||
ERROR("OOPS: %5d cannot map library '%s'. no vspace available.\n",
|
DL_ERR("OOPS: %5d cannot map library '%s'. no vspace available.\n",
|
||||||
pid, si->name);
|
pid, si->name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -764,7 +808,7 @@ load_segments(int fd, void *header, soinfo *si)
|
|||||||
MAP_PRIVATE | MAP_FIXED, fd,
|
MAP_PRIVATE | MAP_FIXED, fd,
|
||||||
phdr->p_offset & (~PAGE_MASK));
|
phdr->p_offset & (~PAGE_MASK));
|
||||||
if (pbase == MAP_FAILED) {
|
if (pbase == MAP_FAILED) {
|
||||||
ERROR("%d failed to map segment from '%s' @ 0x%08x (0x%08x). "
|
DL_ERR("%d failed to map segment from '%s' @ 0x%08x (0x%08x). "
|
||||||
"p_vaddr=0x%08x p_offset=0x%08x\n", pid, si->name,
|
"p_vaddr=0x%08x p_offset=0x%08x\n", pid, si->name,
|
||||||
(unsigned)tmp, len, phdr->p_vaddr, phdr->p_offset);
|
(unsigned)tmp, len, phdr->p_vaddr, phdr->p_offset);
|
||||||
goto fail;
|
goto fail;
|
||||||
@ -820,7 +864,7 @@ load_segments(int fd, void *header, soinfo *si)
|
|||||||
MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS,
|
MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS,
|
||||||
-1, 0);
|
-1, 0);
|
||||||
if (extra_base == MAP_FAILED) {
|
if (extra_base == MAP_FAILED) {
|
||||||
ERROR("[ %5d - failed to extend segment from '%s' @ 0x%08x "
|
DL_ERR("[ %5d - failed to extend segment from '%s' @ 0x%08x"
|
||||||
" (0x%08x) ]\n", pid, si->name, (unsigned)tmp,
|
" (0x%08x) ]\n", pid, si->name, (unsigned)tmp,
|
||||||
extra_len);
|
extra_len);
|
||||||
goto fail;
|
goto fail;
|
||||||
@ -873,7 +917,7 @@ load_segments(int fd, void *header, soinfo *si)
|
|||||||
|
|
||||||
/* Sanity check */
|
/* Sanity check */
|
||||||
if (total_sz > si->size) {
|
if (total_sz > si->size) {
|
||||||
ERROR("%5d - Total length (0x%08x) of mapped segments from '%s' is "
|
DL_ERR("%5d - Total length (0x%08x) of mapped segments from '%s' is "
|
||||||
"greater than what was allocated (0x%08x). THIS IS BAD!\n",
|
"greater than what was allocated (0x%08x). THIS IS BAD!\n",
|
||||||
pid, total_sz, si->name, si->size);
|
pid, total_sz, si->name, si->size);
|
||||||
goto fail;
|
goto fail;
|
||||||
@ -940,18 +984,20 @@ load_library(const char *name)
|
|||||||
soinfo *si = NULL;
|
soinfo *si = NULL;
|
||||||
Elf32_Ehdr *hdr;
|
Elf32_Ehdr *hdr;
|
||||||
|
|
||||||
if(fd == -1)
|
if(fd == -1) {
|
||||||
|
DL_ERR("Library '%s' not found\n", name);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* We have to read the ELF header to figure out what to do with this image
|
/* We have to read the ELF header to figure out what to do with this image
|
||||||
*/
|
*/
|
||||||
if (lseek(fd, 0, SEEK_SET) < 0) {
|
if (lseek(fd, 0, SEEK_SET) < 0) {
|
||||||
ERROR("lseek() failed!\n");
|
DL_ERR("lseek() failed!\n");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((cnt = read(fd, &__header[0], PAGE_SIZE)) < 0) {
|
if ((cnt = read(fd, &__header[0], PAGE_SIZE)) < 0) {
|
||||||
ERROR("read() failed!\n");
|
DL_ERR("read() failed!\n");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1042,8 +1088,8 @@ soinfo *find_library(const char *name)
|
|||||||
if(!strcmp(name, si->name)) {
|
if(!strcmp(name, si->name)) {
|
||||||
if(si->flags & FLAG_ERROR) return 0;
|
if(si->flags & FLAG_ERROR) return 0;
|
||||||
if(si->flags & FLAG_LINKED) return si;
|
if(si->flags & FLAG_LINKED) return si;
|
||||||
ERROR("OOPS: %5d recursive link to '%s'\n", pid, si->name);
|
DL_ERR("OOPS: %5d recursive link to '%s'\n", pid, si->name);
|
||||||
return 0;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1074,7 +1120,7 @@ unsigned unload_library(soinfo *si)
|
|||||||
if(lsi)
|
if(lsi)
|
||||||
unload_library(lsi);
|
unload_library(lsi);
|
||||||
else
|
else
|
||||||
ERROR("%5d could not unload '%s'\n",
|
DL_ERR("%5d could not unload '%s'\n",
|
||||||
pid, si->strtab + d[1]);
|
pid, si->strtab + d[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1121,27 +1167,27 @@ static int reloc_library(soinfo *si, Elf32_Rel *rel, unsigned count)
|
|||||||
DEBUG("%5d Processing '%s' relocation at index %d\n", pid,
|
DEBUG("%5d Processing '%s' relocation at index %d\n", pid,
|
||||||
si->name, idx);
|
si->name, idx);
|
||||||
if(sym != 0) {
|
if(sym != 0) {
|
||||||
s = _do_lookup(si, strtab + symtab[sym].st_name, &base);
|
sym_name = (char *)(strtab + symtab[sym].st_name);
|
||||||
|
s = _do_lookup(si, sym_name, &base);
|
||||||
if(s == 0) {
|
if(s == 0) {
|
||||||
ERROR("%5d cannot locate '%s'...\n", pid, sym_name);
|
DL_ERR("%5d cannot locate '%s'...\n", pid, sym_name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#if 0
|
#if 0
|
||||||
if((base == 0) && (si->base != 0)){
|
if((base == 0) && (si->base != 0)){
|
||||||
/* linking from libraries to main image is bad */
|
/* linking from libraries to main image is bad */
|
||||||
ERROR("%5d cannot locate '%s'...\n",
|
DL_ERR("%5d cannot locate '%s'...\n",
|
||||||
pid, strtab + symtab[sym].st_name);
|
pid, strtab + symtab[sym].st_name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if ((s->st_shndx == SHN_UNDEF) && (s->st_value != 0)) {
|
if ((s->st_shndx == SHN_UNDEF) && (s->st_value != 0)) {
|
||||||
ERROR("%5d In '%s', shndx=%d && value=0x%08x. We do not "
|
DL_ERR("%5d In '%s', shndx=%d && value=0x%08x. We do not "
|
||||||
"handle this yet\n", pid, si->name, s->st_shndx,
|
"handle this yet\n", pid, si->name, s->st_shndx,
|
||||||
s->st_value);
|
s->st_value);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
sym_addr = (unsigned)(s->st_value + base);
|
sym_addr = (unsigned)(s->st_value + base);
|
||||||
sym_name = (char *)(strtab + symtab[sym].st_name);
|
|
||||||
COUNT_RELOC(RELOC_SYMBOL);
|
COUNT_RELOC(RELOC_SYMBOL);
|
||||||
} else {
|
} else {
|
||||||
s = 0;
|
s = 0;
|
||||||
@ -1198,7 +1244,7 @@ static int reloc_library(soinfo *si, Elf32_Rel *rel, unsigned count)
|
|||||||
COUNT_RELOC(RELOC_RELATIVE);
|
COUNT_RELOC(RELOC_RELATIVE);
|
||||||
MARK(rel->r_offset);
|
MARK(rel->r_offset);
|
||||||
if(sym){
|
if(sym){
|
||||||
ERROR("%5d odd RELATIVE form...\n", pid);
|
DL_ERR("%5d odd RELATIVE form...\n", pid);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
TRACE_TYPE(RELO, "%5d RELO RELATIVE %08x <- +%08x\n", pid,
|
TRACE_TYPE(RELO, "%5d RELO RELATIVE %08x <- +%08x\n", pid,
|
||||||
@ -1239,7 +1285,7 @@ static int reloc_library(soinfo *si, Elf32_Rel *rel, unsigned count)
|
|||||||
#endif /* ANDROID_ARM_LINKER */
|
#endif /* ANDROID_ARM_LINKER */
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ERROR("%5d unknown reloc type %d @ %p (%d)\n",
|
DL_ERR("%5d unknown reloc type %d @ %p (%d)\n",
|
||||||
pid, type, rel, (int) (rel - start));
|
pid, type, rel, (int) (rel - start));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -1248,13 +1294,38 @@ static int reloc_library(soinfo *si, Elf32_Rel *rel, unsigned count)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void call_array(unsigned *ctor, int count)
|
|
||||||
|
/* Please read the "Initialization and Termination functions" functions.
|
||||||
|
* of the linker design note in bionic/linker/README.TXT to understand
|
||||||
|
* what the following code is doing.
|
||||||
|
*
|
||||||
|
* The important things to remember are:
|
||||||
|
*
|
||||||
|
* DT_PREINIT_ARRAY must be called first for executables, and should
|
||||||
|
* not appear in shared libraries.
|
||||||
|
*
|
||||||
|
* DT_INIT should be called before DT_INIT_ARRAY if both are present
|
||||||
|
*
|
||||||
|
* DT_FINI should be called after DT_FINI_ARRAY if both are present
|
||||||
|
*
|
||||||
|
* DT_FINI_ARRAY must be parsed in reverse order.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void call_array(unsigned *ctor, int count, int reverse)
|
||||||
{
|
{
|
||||||
int n;
|
int n, inc = 1;
|
||||||
|
|
||||||
|
if (reverse) {
|
||||||
|
ctor += (count-1);
|
||||||
|
inc = -1;
|
||||||
|
}
|
||||||
|
|
||||||
for(n = count; n > 0; n--) {
|
for(n = count; n > 0; n--) {
|
||||||
TRACE("[ %5d Looking at ctor *0x%08x == 0x%08x ]\n", pid,
|
TRACE("[ %5d Looking at %s *0x%08x == 0x%08x ]\n", pid,
|
||||||
|
reverse ? "dtor" : "ctor",
|
||||||
(unsigned)ctor, (unsigned)*ctor);
|
(unsigned)ctor, (unsigned)*ctor);
|
||||||
void (*func)() = (void (*)()) *ctor++;
|
void (*func)() = (void (*)()) *ctor;
|
||||||
|
ctor += inc;
|
||||||
if(((int) func == 0) || ((int) func == -1)) continue;
|
if(((int) func == 0) || ((int) func == -1)) continue;
|
||||||
TRACE("[ %5d Calling func @ 0x%08x ]\n", pid, (unsigned)func);
|
TRACE("[ %5d Calling func @ 0x%08x ]\n", pid, (unsigned)func);
|
||||||
func();
|
func();
|
||||||
@ -1263,31 +1334,20 @@ static void call_array(unsigned *ctor, int count)
|
|||||||
|
|
||||||
static void call_constructors(soinfo *si)
|
static void call_constructors(soinfo *si)
|
||||||
{
|
{
|
||||||
/* TODO: THE ORIGINAL CODE SEEMED TO CALL THE INIT FUNCS IN THE WRONG ORDER.
|
|
||||||
* Old order: init, init_array, preinit_array..
|
|
||||||
* Correct order: preinit_array, init, init_array.
|
|
||||||
* Verify WHY.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (si->flags & FLAG_EXE) {
|
if (si->flags & FLAG_EXE) {
|
||||||
TRACE("[ %5d Calling preinit_array @ 0x%08x [%d] for '%s' ]\n",
|
TRACE("[ %5d Calling preinit_array @ 0x%08x [%d] for '%s' ]\n",
|
||||||
pid, (unsigned)si->preinit_array, si->preinit_array_count,
|
pid, (unsigned)si->preinit_array, si->preinit_array_count,
|
||||||
si->name);
|
si->name);
|
||||||
call_array(si->preinit_array, si->preinit_array_count);
|
call_array(si->preinit_array, si->preinit_array_count, 0);
|
||||||
TRACE("[ %5d Done calling preinit_array for '%s' ]\n", pid, si->name);
|
TRACE("[ %5d Done calling preinit_array for '%s' ]\n", pid, si->name);
|
||||||
} else {
|
} else {
|
||||||
if (si->preinit_array) {
|
if (si->preinit_array) {
|
||||||
ERROR("%5d Shared library '%s' has a preinit_array table @ 0x%08x."
|
DL_ERR("%5d Shared library '%s' has a preinit_array table @ 0x%08x."
|
||||||
" This is INVALID.\n", pid, si->name,
|
" This is INVALID.\n", pid, si->name,
|
||||||
(unsigned)si->preinit_array);
|
(unsigned)si->preinit_array);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we have an init section, then we should call it now, to make sure
|
|
||||||
// that all the funcs in the .ctors section get run.
|
|
||||||
// Note: For ARM, we shouldn't have a .ctor section (should be empty)
|
|
||||||
// when we have an (pre)init_array section, but let's be compatible with
|
|
||||||
// old (non-eabi) binaries and try the _init (DT_INIT) anyway.
|
|
||||||
if (si->init_func) {
|
if (si->init_func) {
|
||||||
TRACE("[ %5d Calling init_func @ 0x%08x for '%s' ]\n", pid,
|
TRACE("[ %5d Calling init_func @ 0x%08x for '%s' ]\n", pid,
|
||||||
(unsigned)si->init_func, si->name);
|
(unsigned)si->init_func, si->name);
|
||||||
@ -1298,25 +1358,21 @@ static void call_constructors(soinfo *si)
|
|||||||
if (si->init_array) {
|
if (si->init_array) {
|
||||||
TRACE("[ %5d Calling init_array @ 0x%08x [%d] for '%s' ]\n", pid,
|
TRACE("[ %5d Calling init_array @ 0x%08x [%d] for '%s' ]\n", pid,
|
||||||
(unsigned)si->init_array, si->init_array_count, si->name);
|
(unsigned)si->init_array, si->init_array_count, si->name);
|
||||||
call_array(si->init_array, si->init_array_count);
|
call_array(si->init_array, si->init_array_count, 0);
|
||||||
TRACE("[ %5d Done calling init_array for '%s' ]\n", pid, si->name);
|
TRACE("[ %5d Done calling init_array for '%s' ]\n", pid, si->name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void call_destructors(soinfo *si)
|
static void call_destructors(soinfo *si)
|
||||||
{
|
{
|
||||||
if (si->fini_array) {
|
if (si->fini_array) {
|
||||||
TRACE("[ %5d Calling fini_array @ 0x%08x [%d] for '%s' ]\n", pid,
|
TRACE("[ %5d Calling fini_array @ 0x%08x [%d] for '%s' ]\n", pid,
|
||||||
(unsigned)si->fini_array, si->fini_array_count, si->name);
|
(unsigned)si->fini_array, si->fini_array_count, si->name);
|
||||||
call_array(si->fini_array, si->fini_array_count);
|
call_array(si->fini_array, si->fini_array_count, 1);
|
||||||
TRACE("[ %5d Done calling fini_array for '%s' ]\n", pid, si->name);
|
TRACE("[ %5d Done calling fini_array for '%s' ]\n", pid, si->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we have an fini section, then we should call it now, to make sure
|
|
||||||
// that all the funcs in the .dtors section get run.
|
|
||||||
// Note: For ARM, we shouldn't have a .dtor section (should be empty)
|
|
||||||
// when we have an fini_array section, but let's be compatible with
|
|
||||||
// old (non-eabi) binaries and try the _fini (DT_FINI) anyway.
|
|
||||||
if (si->fini_func) {
|
if (si->fini_func) {
|
||||||
TRACE("[ %5d Calling fini_func @ 0x%08x for '%s' ]\n", pid,
|
TRACE("[ %5d Calling fini_func @ 0x%08x for '%s' ]\n", pid,
|
||||||
(unsigned)si->fini_func, si->name);
|
(unsigned)si->fini_func, si->name);
|
||||||
@ -1334,7 +1390,7 @@ static int nullify_closed_stdio (void)
|
|||||||
|
|
||||||
dev_null = open("/dev/null", O_RDWR);
|
dev_null = open("/dev/null", O_RDWR);
|
||||||
if (dev_null < 0) {
|
if (dev_null < 0) {
|
||||||
ERROR("Cannot open /dev/null.\n");
|
DL_ERR("Cannot open /dev/null.\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
TRACE("[ %5d Opened /dev/null file-descriptor=%d]\n", pid, dev_null);
|
TRACE("[ %5d Opened /dev/null file-descriptor=%d]\n", pid, dev_null);
|
||||||
@ -1360,7 +1416,7 @@ static int nullify_closed_stdio (void)
|
|||||||
/* The only error we allow is that the file descriptor does not
|
/* The only error we allow is that the file descriptor does not
|
||||||
exist, in which case we dup /dev/null to it. */
|
exist, in which case we dup /dev/null to it. */
|
||||||
if (errno != EBADF) {
|
if (errno != EBADF) {
|
||||||
ERROR("nullify_stdio: unhandled error %s\n", strerror(errno));
|
DL_ERR("nullify_stdio: unhandled error %s\n", strerror(errno));
|
||||||
return_value = -1;
|
return_value = -1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1373,7 +1429,7 @@ static int nullify_closed_stdio (void)
|
|||||||
} while (status < 0 && errno == EINTR);
|
} while (status < 0 && errno == EINTR);
|
||||||
|
|
||||||
if (status < 0) {
|
if (status < 0) {
|
||||||
ERROR("nullify_stdio: dup2 error %s\n", strerror(errno));
|
DL_ERR("nullify_stdio: dup2 error %s\n", strerror(errno));
|
||||||
return_value = -1;
|
return_value = -1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1387,7 +1443,7 @@ static int nullify_closed_stdio (void)
|
|||||||
} while (status < 0 && errno == EINTR);
|
} while (status < 0 && errno == EINTR);
|
||||||
|
|
||||||
if (status < 0) {
|
if (status < 0) {
|
||||||
ERROR("nullify_stdio: close error %s\n", strerror(errno));
|
DL_ERR("nullify_stdio: close error %s\n", strerror(errno));
|
||||||
return_value = -1;
|
return_value = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1455,7 +1511,7 @@ static int link_image(soinfo *si, unsigned wr_offset)
|
|||||||
}
|
}
|
||||||
} else if (phdr->p_type == PT_DYNAMIC) {
|
} else if (phdr->p_type == PT_DYNAMIC) {
|
||||||
if (si->dynamic != (unsigned *)-1) {
|
if (si->dynamic != (unsigned *)-1) {
|
||||||
ERROR("%5d multiple PT_DYNAMIC segments found in '%s'. "
|
DL_ERR("%5d multiple PT_DYNAMIC segments found in '%s'. "
|
||||||
"Segment at 0x%08x, previously one found at 0x%08x\n",
|
"Segment at 0x%08x, previously one found at 0x%08x\n",
|
||||||
pid, si->name, si->base + phdr->p_vaddr,
|
pid, si->name, si->base + phdr->p_vaddr,
|
||||||
(unsigned)si->dynamic);
|
(unsigned)si->dynamic);
|
||||||
@ -1468,7 +1524,7 @@ static int link_image(soinfo *si, unsigned wr_offset)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (si->dynamic == (unsigned *)-1) {
|
if (si->dynamic == (unsigned *)-1) {
|
||||||
ERROR("%5d missing PT_DYNAMIC?!\n", pid);
|
DL_ERR("%5d missing PT_DYNAMIC?!\n", pid);
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1492,7 +1548,7 @@ static int link_image(soinfo *si, unsigned wr_offset)
|
|||||||
break;
|
break;
|
||||||
case DT_PLTREL:
|
case DT_PLTREL:
|
||||||
if(*d != DT_REL) {
|
if(*d != DT_REL) {
|
||||||
ERROR("DT_RELA not supported\n");
|
DL_ERR("DT_RELA not supported\n");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1517,7 +1573,7 @@ static int link_image(soinfo *si, unsigned wr_offset)
|
|||||||
*d = (int) &_r_debug;
|
*d = (int) &_r_debug;
|
||||||
break;
|
break;
|
||||||
case DT_RELA:
|
case DT_RELA:
|
||||||
ERROR("%5d DT_RELA not supported\n", pid);
|
DL_ERR("%5d DT_RELA not supported\n", pid);
|
||||||
goto fail;
|
goto fail;
|
||||||
case DT_INIT:
|
case DT_INIT:
|
||||||
si->init_func = (void (*)(void))(si->base + *d);
|
si->init_func = (void (*)(void))(si->base + *d);
|
||||||
@ -1569,7 +1625,7 @@ static int link_image(soinfo *si, unsigned wr_offset)
|
|||||||
pid, si->base, si->strtab, si->symtab);
|
pid, si->base, si->strtab, si->symtab);
|
||||||
|
|
||||||
if((si->strtab == 0) || (si->symtab == 0)) {
|
if((si->strtab == 0) || (si->symtab == 0)) {
|
||||||
ERROR("%5d missing essential tables\n", pid);
|
DL_ERR("%5d missing essential tables\n", pid);
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1578,7 +1634,9 @@ static int link_image(soinfo *si, unsigned wr_offset)
|
|||||||
DEBUG("%5d %s needs %s\n", pid, si->name, si->strtab + d[1]);
|
DEBUG("%5d %s needs %s\n", pid, si->name, si->strtab + d[1]);
|
||||||
soinfo *lsi = find_library(si->strtab + d[1]);
|
soinfo *lsi = find_library(si->strtab + d[1]);
|
||||||
if(lsi == 0) {
|
if(lsi == 0) {
|
||||||
ERROR("%5d could not load '%s'\n", pid, si->strtab + d[1]);
|
strlcpy(tmp_err_buf, linker_get_error(), sizeof(tmp_err_buf));
|
||||||
|
DL_ERR("%5d could not load needed library '%s' for '%s' (%s)\n",
|
||||||
|
pid, si->strtab + d[1], si->name, tmp_err_buf);
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
lsi->refcount++;
|
lsi->refcount++;
|
||||||
@ -1643,6 +1701,29 @@ fail:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void parse_library_path(char *path, char *delim)
|
||||||
|
{
|
||||||
|
size_t len;
|
||||||
|
char *ldpaths_bufp = ldpaths_buf;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
len = strlcpy(ldpaths_buf, path, sizeof(ldpaths_buf));
|
||||||
|
|
||||||
|
while (i < LDPATH_MAX && (ldpaths[i] = strsep(&ldpaths_bufp, delim))) {
|
||||||
|
if (*ldpaths[i] != '\0')
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Forget the last path if we had to truncate; this occurs if the 2nd to
|
||||||
|
* last char isn't '\0' (i.e. not originally a delim). */
|
||||||
|
if (i > 0 && len >= sizeof(ldpaths_buf) &&
|
||||||
|
ldpaths_buf[sizeof(ldpaths_buf) - 2] != '\0') {
|
||||||
|
ldpaths[i - 1] = NULL;
|
||||||
|
} else {
|
||||||
|
ldpaths[i] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@ -1661,6 +1742,7 @@ unsigned __linker_init(unsigned **elfdata)
|
|||||||
unsigned *vecs = (unsigned*) (argv + argc + 1);
|
unsigned *vecs = (unsigned*) (argv + argc + 1);
|
||||||
soinfo *si;
|
soinfo *si;
|
||||||
struct link_map * map;
|
struct link_map * map;
|
||||||
|
char *ldpath_env = NULL;
|
||||||
|
|
||||||
pid = getpid();
|
pid = getpid();
|
||||||
|
|
||||||
@ -1678,6 +1760,8 @@ unsigned __linker_init(unsigned **elfdata)
|
|||||||
while(vecs[0] != 0) {
|
while(vecs[0] != 0) {
|
||||||
if(!strncmp((char*) vecs[0], "DEBUG=", 6)) {
|
if(!strncmp((char*) vecs[0], "DEBUG=", 6)) {
|
||||||
debug_verbosity = atoi(((char*) vecs[0]) + 6);
|
debug_verbosity = atoi(((char*) vecs[0]) + 6);
|
||||||
|
} else if(!strncmp((char*) vecs[0], "LD_LIBRARY_PATH=", 16)) {
|
||||||
|
ldpath_env = (char*) vecs[0] + 16;
|
||||||
}
|
}
|
||||||
vecs++;
|
vecs++;
|
||||||
}
|
}
|
||||||
@ -1737,8 +1821,14 @@ unsigned __linker_init(unsigned **elfdata)
|
|||||||
si->wrprotect_start = 0xffffffff;
|
si->wrprotect_start = 0xffffffff;
|
||||||
si->wrprotect_end = 0;
|
si->wrprotect_end = 0;
|
||||||
|
|
||||||
|
/* Use LD_LIBRARY_PATH if we aren't setuid/setgid */
|
||||||
|
if (ldpath_env && getuid() == geteuid() && getgid() == getegid())
|
||||||
|
parse_library_path(ldpath_env, ":");
|
||||||
|
|
||||||
if(link_image(si, 0)) {
|
if(link_image(si, 0)) {
|
||||||
ERROR("CANNOT LINK EXECUTABLE '%s'\n", argv[0]);
|
char errmsg[] = "CANNOT LINK EXECUTABLE\n";
|
||||||
|
write(2, __linker_dl_err_buf, strlen(__linker_dl_err_buf));
|
||||||
|
write(2, errmsg, sizeof(errmsg));
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -204,6 +204,7 @@ soinfo *find_library(const char *name);
|
|||||||
unsigned unload_library(soinfo *si);
|
unsigned unload_library(soinfo *si);
|
||||||
Elf32_Sym *lookup_in_library(soinfo *si, const char *name);
|
Elf32_Sym *lookup_in_library(soinfo *si, const char *name);
|
||||||
Elf32_Sym *lookup(const char *name, unsigned *base);
|
Elf32_Sym *lookup(const char *name, unsigned *base);
|
||||||
|
const char *linker_get_error(void);
|
||||||
|
|
||||||
#ifdef ANDROID_ARM_LINKER
|
#ifdef ANDROID_ARM_LINKER
|
||||||
typedef long unsigned int *_Unwind_Ptr;
|
typedef long unsigned int *_Unwind_Ptr;
|
||||||
|
@ -55,17 +55,16 @@
|
|||||||
#define TRUE 1
|
#define TRUE 1
|
||||||
#define FALSE 0
|
#define FALSE 0
|
||||||
|
|
||||||
|
|
||||||
#define __PRINTVF(v,f,x...) do { \
|
|
||||||
(debug_verbosity > (v)) && (printf(x), ((f) && fflush(stdout))); \
|
|
||||||
} while (0)
|
|
||||||
/* Only use printf() during debugging. We have seen occasional memory
|
/* Only use printf() during debugging. We have seen occasional memory
|
||||||
* corruption when the linker uses printf().
|
* corruption when the linker uses printf().
|
||||||
*/
|
*/
|
||||||
#if LINKER_DEBUG
|
#if LINKER_DEBUG
|
||||||
extern int debug_verbosity;
|
extern int debug_verbosity;
|
||||||
#warning "*** LINKER IS USING printf(); DO NOT CHECK THIS IN ***"
|
#warning "*** LINKER IS USING printf(); DO NOT CHECK THIS IN ***"
|
||||||
#define _PRINTVF(v,f,x...) __PRINTVF(v,f,x)
|
#define _PRINTVF(v,f,x...) \
|
||||||
|
do { \
|
||||||
|
(debug_verbosity > (v)) && (printf(x), ((f) && fflush(stdout))); \
|
||||||
|
} while (0)
|
||||||
#else /* !LINKER_DEBUG */
|
#else /* !LINKER_DEBUG */
|
||||||
#define _PRINTVF(v,f,x...) do {} while(0)
|
#define _PRINTVF(v,f,x...) do {} while(0)
|
||||||
#endif /* LINKER_DEBUG */
|
#endif /* LINKER_DEBUG */
|
||||||
@ -76,7 +75,8 @@ extern int debug_verbosity;
|
|||||||
#define WARN(fmt,args...) \
|
#define WARN(fmt,args...) \
|
||||||
_PRINTVF(-1, TRUE, "%s:%d| WARNING: " fmt, __FILE__, __LINE__, ## args)
|
_PRINTVF(-1, TRUE, "%s:%d| WARNING: " fmt, __FILE__, __LINE__, ## args)
|
||||||
#define ERROR(fmt,args...) \
|
#define ERROR(fmt,args...) \
|
||||||
__PRINTVF(-1, TRUE, "%s:%d| ERROR: " fmt, __FILE__, __LINE__, ## args)
|
_PRINTVF(-1, TRUE, "%s:%d| ERROR: " fmt, __FILE__, __LINE__, ## args)
|
||||||
|
|
||||||
|
|
||||||
#if TRACE_DEBUG
|
#if TRACE_DEBUG
|
||||||
#define DEBUG(x...) _PRINTVF(2, TRUE, "DEBUG: " x)
|
#define DEBUG(x...) _PRINTVF(2, TRUE, "DEBUG: " x)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user