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)
|
||||
|
||||
include $(LOCAL_PATH)/arch-$(TARGET_ARCH)/syscalls.mk
|
||||
|
||||
# Define the common source files for all the libc instances
|
||||
# =========================================================
|
||||
libc_common_src_files := \
|
||||
$(syscall_src) \
|
||||
unistd/abort.c \
|
||||
@ -272,6 +275,8 @@ libc_common_src_files := \
|
||||
netbsd/nameser/ns_print.c \
|
||||
netbsd/nameser/ns_samedomain.c
|
||||
|
||||
# Architecture specific source files go here
|
||||
# =========================================================
|
||||
ifeq ($(TARGET_ARCH),arm)
|
||||
libc_common_src_files += \
|
||||
bionic/eabi.c \
|
||||
@ -301,6 +306,14 @@ libc_common_src_files += \
|
||||
bionic/pthread.c.arm \
|
||||
bionic/pthread-timers.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
|
||||
|
||||
ifeq ($(TARGET_ARCH),x86)
|
||||
@ -322,10 +335,17 @@ libc_common_src_files += \
|
||||
bionic/pthread.c \
|
||||
bionic/pthread-timers.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
|
||||
|
||||
# Define some common cflags
|
||||
# ========================================================
|
||||
libc_common_cflags := \
|
||||
-DWITH_ERRLIST \
|
||||
-DANDROID_CHANGES \
|
||||
@ -337,162 +357,158 @@ libc_common_cflags := \
|
||||
-DNEED_PSELECT=1 \
|
||||
-DINET6 \
|
||||
-I$(LOCAL_PATH)/private \
|
||||
-DUSE_DL_PREFIX
|
||||
|
||||
ifeq ($(TARGET_BUILD_TYPE),debug)
|
||||
ifeq ($(strip $(DEBUG_BIONIC_LIBC)),true)
|
||||
libc_common_cflags += -DDEBUG
|
||||
endif
|
||||
|
||||
ifeq ($(TARGET_ARCH),arm)
|
||||
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 := \
|
||||
$(LOCAL_PATH)/stdlib \
|
||||
$(LOCAL_PATH)/string \
|
||||
$(LOCAL_PATH)/stdio
|
||||
|
||||
# libc_common.a
|
||||
# ========================================================
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_SRC_FILES := $(libc_common_src_files)
|
||||
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)
|
||||
# Define the libc run-time (crt) support object files that must be built,
|
||||
# which are needed to build all other objects (shared/static libs and
|
||||
# executables)
|
||||
# ==========================================================================
|
||||
|
||||
ifeq ($(TARGET_ARCH),x86)
|
||||
|
||||
crt_begin_end_so_target_cflags := -m32
|
||||
|
||||
# we only need begin_so/end_so for x86, since it needs an appropriate .init
|
||||
# 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): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin_so.S
|
||||
@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)
|
||||
|
||||
GEN := $(TARGET_OUT_STATIC_LIBRARIES)/crtend_so.o
|
||||
$(GEN): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtend_so.S
|
||||
@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)
|
||||
|
||||
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_SYSTEM_SHARED_LIBRARIES :=
|
||||
|
||||
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 $(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 := \
|
||||
$(libc_common_src_files) \
|
||||
bionic/dlmalloc.c \
|
||||
$(libc_arch_static_src_files) \
|
||||
bionic/libc_init_static.c
|
||||
|
||||
ifeq ($(WITH_MALLOC_CHECK_LIBC_A),true)
|
||||
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_C_INCLUDES := $(libc_common_c_includes)
|
||||
LOCAL_CFLAGS := $(libc_common_cflags)
|
||||
|
||||
LOCAL_C_INCLUDES := $(libc_common_c_includes)
|
||||
|
||||
ifeq ($(WITH_MALLOC_CHECK_LIBC_A),true)
|
||||
LOCAL_CFLAGS += -DUSE_DL_PREFIX -DMALLOC_LEAK_CHECK
|
||||
endif
|
||||
|
||||
LOCAL_MODULE := libc_nomalloc
|
||||
LOCAL_WHOLE_STATIC_LIBRARIES := libc_common
|
||||
LOCAL_MODULE:= libc
|
||||
LOCAL_SYSTEM_SHARED_LIBRARIES :=
|
||||
|
||||
include $(BUILD_STATIC_LIBRARY)
|
||||
|
||||
|
||||
# libc.so
|
||||
# ========================================================
|
||||
|
||||
# libc.a
|
||||
# ========================================================
|
||||
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 += -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_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 := \
|
||||
$(libc_arch_dynamic_src_files) \
|
||||
bionic/dlmalloc.c \
|
||||
bionic/malloc_leak.c.arm \
|
||||
bionic/libc_init_dynamic.c
|
||||
|
||||
ifeq ($(TARGET_ARCH),arm)
|
||||
LOCAL_SRC_FILES += \
|
||||
arch-arm/bionic/exidx_dynamic.c
|
||||
endif
|
||||
|
||||
LOCAL_MODULE:= libc
|
||||
|
||||
# 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_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)
|
||||
|
||||
|
||||
# ========================================================
|
||||
# libc_debug.so
|
||||
# ========================================================
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_CFLAGS := $(libc_common_cflags)
|
||||
|
||||
LOCAL_CFLAGS += -DUSE_DL_PREFIX -DMALLOC_LEAK_CHECK
|
||||
LOCAL_CFLAGS := \
|
||||
$(libc_common_cflags) \
|
||||
-DMALLOC_LEAK_CHECK
|
||||
|
||||
LOCAL_C_INCLUDES := $(libc_common_c_includes)
|
||||
|
||||
LOCAL_SRC_FILES := \
|
||||
$(libc_arch_dynamic_src_files) \
|
||||
bionic/dlmalloc.c \
|
||||
bionic/malloc_leak.c.arm \
|
||||
bionic/libc_init_dynamic.c
|
||||
|
||||
ifeq ($(TARGET_ARCH),arm)
|
||||
LOCAL_SRC_FILES += \
|
||||
arch-arm/bionic/exidx_dynamic.c
|
||||
endif
|
||||
|
||||
LOCAL_MODULE:= libc_debug
|
||||
|
||||
# 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
|
||||
LOCAL_MODULE_TAGS := eng
|
||||
|
||||
GEN := $(TARGET_OUT_STATIC_LIBRARIES)/crtbegin_dynamic.o
|
||||
ALL_GENERATED_SOURCES += $(GEN)
|
||||
|
||||
include $(BUILD_SHARED_LIBRARY)
|
||||
|
||||
# ========================================================
|
||||
|
@ -28,15 +28,24 @@
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
|
||||
extern int __cxa_atexit(void (*)(void*), void*, void* );
|
||||
|
||||
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
|
||||
* with libstdc++-v3. */
|
||||
int __attribute__((weak))
|
||||
__aeabi_atexit (void *object, void (*destructor) (void *), void *dso_handle)
|
||||
{
|
||||
//return __cxa_atexit(destructor, object, dso_handle);
|
||||
return 0;
|
||||
return __cxa_atexit(destructor, object, dso_handle);
|
||||
}
|
||||
|
||||
|
||||
|
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;
|
||||
};
|
||||
|
||||
/* 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 fchmod(int, 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/ioctl.h>
|
||||
#include <asm/sizes.h>
|
||||
|
||||
#define ADSP_IOCTL_MAGIC 'q'
|
||||
|
||||
@ -33,25 +32,32 @@ struct adsp_event_t {
|
||||
uint8_t *data;
|
||||
};
|
||||
|
||||
struct adsp_pmem_info_t {
|
||||
#define ADSP_IOCTL_ENABLE _IOR(ADSP_IOCTL_MAGIC, 1, unsigned)
|
||||
|
||||
#define ADSP_IOCTL_DISABLE _IOR(ADSP_IOCTL_MAGIC, 2, unsigned)
|
||||
|
||||
#define ADSP_IOCTL_DISABLE_ACK _IOR(ADSP_IOCTL_MAGIC, 3, unsigned)
|
||||
|
||||
#define ADSP_IOCTL_WRITE_COMMAND _IOR(ADSP_IOCTL_MAGIC, 4, struct adsp_command_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)
|
||||
|
||||
struct adsp_pmem_info {
|
||||
int fd;
|
||||
void *vaddr;
|
||||
};
|
||||
|
||||
#define ADSP_IOCTL_ENABLE _IOR(ADSP_IOCTL_MAGIC, 1, unsigned)
|
||||
#define ADSP_IOCTL_REGISTER_PMEM _IOW(ADSP_IOCTL_MAGIC, 13, unsigned)
|
||||
|
||||
#define ADSP_IOCTL_DISABLE _IOR(ADSP_IOCTL_MAGIC, 2, unsigned)
|
||||
#define ADSP_IOCTL_UNREGISTER_PMEM _IOW(ADSP_IOCTL_MAGIC, 14, unsigned)
|
||||
|
||||
#define ADSP_IOCTL_DISABLE_ACK _IOR(ADSP_IOCTL_MAGIC, 3, unsigned)
|
||||
#define ADSP_IOCTL_ABORT_EVENT_READ _IOW(ADSP_IOCTL_MAGIC, 15, unsigned)
|
||||
|
||||
#define ADSP_IOCTL_WRITE_COMMAND _IOR(ADSP_IOCTL_MAGIC, 4, struct adsp_command_t *)
|
||||
|
||||
#define ADSP_IOCTL_GET_EVENT _IOWR(ADSP_IOCTL_MAGIC, 5, struct adsp_event_data_t *)
|
||||
|
||||
#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 *)
|
||||
|
||||
#define ADSP_IOCTL_ABORT_EVENT_READ _IOW(ADSP_IOCTL_MAGIC, 15, unsigned)
|
||||
#define ADSP_IOCTL_LINK_TASK _IOW(ADSP_IOCTL_MAGIC, 16, unsigned)
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -82,4 +82,3 @@ struct msm_snd_endpoint {
|
||||
#define SND_GET_ENDPOINT _IOWR(SND_IOCTL_MAGIC, 5, struct msm_snd_endpoint *)
|
||||
|
||||
#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 )
|
||||
|
||||
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:
|
||||
b.updateP4Files()
|
||||
|
@ -912,7 +912,11 @@ get_port(const struct addrinfo *ai, const char *servname, int matchonly)
|
||||
allownumeric = 1;
|
||||
break;
|
||||
case ANY:
|
||||
#if 1 /* ANDROID-SPECIFIC CHANGE TO MATCH GLIBC */
|
||||
allownumeric = 1;
|
||||
#else
|
||||
allownumeric = 0;
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
return EAI_SOCKTYPE;
|
||||
@ -1271,7 +1275,7 @@ _dns_getaddrinfo(void *rv, void *cb_data, va_list ap)
|
||||
name = va_arg(ap, char *);
|
||||
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(&q2, 0, sizeof(q2));
|
||||
@ -1630,7 +1634,7 @@ res_searchN(const char *name, struct res_target *target, res_state res)
|
||||
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
|
||||
|
@ -27,6 +27,7 @@
|
||||
*/
|
||||
#include <sys/cdefs.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/endian.h>
|
||||
#include <netdb.h>
|
||||
#include "servent.h"
|
||||
#include "services.h"
|
||||
@ -54,6 +55,7 @@ getservent_r( res_static rs )
|
||||
int namelen;
|
||||
int nn,count;
|
||||
int total = 0;
|
||||
int port;
|
||||
char* p2;
|
||||
|
||||
p = rs->servent_ptr;
|
||||
@ -92,9 +94,12 @@ getservent_r( res_static rs )
|
||||
memcpy( rs->servent.s_name, p+1, namelen );
|
||||
rs->servent.s_name[namelen] = 0;
|
||||
p += 1 + namelen;
|
||||
rs->servent.s_port = ((((unsigned char*)p)[0] << 8) |
|
||||
((unsigned char*)p)[1]);
|
||||
|
||||
/* s_port must be in network byte order */
|
||||
port = ((((unsigned char*)p)[0] << 8) |
|
||||
((unsigned char*)p)[1]);
|
||||
|
||||
rs->servent.s_port = htons(port);
|
||||
rs->servent.s_proto = p[2] == 't' ? "tcp" : "udp";
|
||||
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 DNS_PROP_NAME_PREFIX "net.dns"
|
||||
#define DNS_CHANGE_PROP_NAME "net.dnschange"
|
||||
#define DNS_SEARCH_PROP_NAME "net.dns.search"
|
||||
const prop_info *dns_change_prop;
|
||||
int dns_last_change_counter;
|
||||
static int _get_dns_change_count();
|
||||
@ -168,6 +169,39 @@ res_ninit(res_state statp) {
|
||||
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. */
|
||||
int
|
||||
__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 */
|
||||
#define MATCH(line, name) \
|
||||
(!strncmp(line, name, sizeof(name) - 1) && \
|
||||
|
@ -147,10 +147,19 @@ __cxa_finalize(void *dso)
|
||||
p->fns[n].fn_ptr.cxa_func = NULL;
|
||||
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)
|
||||
(*fn.fn_ptr.cxa_func)(fn.fn_arg);
|
||||
else
|
||||
(*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__
|
||||
#define __NEW__
|
||||
|
||||
#include <stddef.h>
|
||||
#include <cstddef>
|
||||
|
||||
namespace std {
|
||||
using ::size_t;
|
||||
|
||||
struct nothrow_t {};
|
||||
extern const nothrow_t nothrow;
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ endif
|
||||
|
||||
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
|
||||
|
||||
|
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,41 +15,49 @@
|
||||
*/
|
||||
#include <dlfcn.h>
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include "linker.h"
|
||||
|
||||
/* This file hijacks the symbols stubbed out in libdl.so. */
|
||||
|
||||
#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_BAD_SYMBOL_NAME 3
|
||||
#define DL_ERR_SYMBOL_NOT_FOUND 4
|
||||
#define DL_ERR_SYMBOL_NOT_GLOBAL 5
|
||||
|
||||
static char dl_err_buf[1024];
|
||||
static const char *dl_err_str;
|
||||
|
||||
static const char *dl_errors[] = {
|
||||
[DL_SUCCESS] = NULL,
|
||||
[DL_ERR_CANNOT_FIND_LIBRARY] = "Cannot find library",
|
||||
[DL_ERR_CANNOT_LOAD_LIBRARY] = "Cannot load library",
|
||||
[DL_ERR_INVALID_LIBRARY_HANDLE] = "Invalid library handle",
|
||||
[DL_ERR_BAD_SYMBOL_NAME] = "Invalid symbol name",
|
||||
[DL_ERR_SYMBOL_NOT_FOUND] = "Symbol not found",
|
||||
[DL_ERR_SYMBOL_NOT_GLOBAL] = "Symbol is not global",
|
||||
};
|
||||
|
||||
static int dl_last_err = DL_SUCCESS;
|
||||
|
||||
#define likely(expr) __builtin_expect (expr, 1)
|
||||
#define unlikely(expr) __builtin_expect (expr, 0)
|
||||
|
||||
static pthread_mutex_t dl_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
void *dlopen(const char *filename, int flag)
|
||||
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)
|
||||
{
|
||||
soinfo *ret;
|
||||
|
||||
pthread_mutex_lock(&dl_lock);
|
||||
ret = find_library(filename);
|
||||
if (unlikely(ret == NULL)) {
|
||||
dl_last_err = DL_ERR_CANNOT_FIND_LIBRARY;
|
||||
set_dlerror(DL_ERR_CANNOT_LOAD_LIBRARY);
|
||||
} else {
|
||||
ret->refcount++;
|
||||
}
|
||||
@ -59,9 +67,9 @@ void *dlopen(const char *filename, int flag)
|
||||
|
||||
const char *dlerror(void)
|
||||
{
|
||||
const char *err = dl_errors[dl_last_err];
|
||||
dl_last_err = DL_SUCCESS;
|
||||
return err;
|
||||
const char *tmp = dl_err_str;
|
||||
dl_err_str = NULL;
|
||||
return (const char *)tmp;
|
||||
}
|
||||
|
||||
void *dlsym(void *handle, const char *symbol)
|
||||
@ -71,16 +79,16 @@ void *dlsym(void *handle, const char *symbol)
|
||||
unsigned bind;
|
||||
|
||||
pthread_mutex_lock(&dl_lock);
|
||||
|
||||
|
||||
if(unlikely(handle == 0)) {
|
||||
dl_last_err = DL_ERR_INVALID_LIBRARY_HANDLE;
|
||||
set_dlerror(DL_ERR_INVALID_LIBRARY_HANDLE);
|
||||
goto err;
|
||||
}
|
||||
if(unlikely(symbol == 0)) {
|
||||
dl_last_err = DL_ERR_BAD_SYMBOL_NAME;
|
||||
set_dlerror(DL_ERR_BAD_SYMBOL_NAME);
|
||||
goto err;
|
||||
}
|
||||
|
||||
|
||||
if(handle == RTLD_DEFAULT) {
|
||||
sym = lookup(symbol, &base);
|
||||
} else if(handle == RTLD_NEXT) {
|
||||
@ -92,16 +100,17 @@ void *dlsym(void *handle, const char *symbol)
|
||||
|
||||
if(likely(sym != 0)) {
|
||||
bind = ELF32_ST_BIND(sym->st_info);
|
||||
|
||||
|
||||
if(likely((bind == STB_GLOBAL) && (sym->st_shndx != 0))) {
|
||||
unsigned ret = sym->st_value + base;
|
||||
pthread_mutex_unlock(&dl_lock);
|
||||
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:
|
||||
pthread_mutex_unlock(&dl_lock);
|
||||
|
236
linker/linker.c
236
linker/linker.c
@ -51,7 +51,11 @@
|
||||
|
||||
#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 <<<
|
||||
*
|
||||
@ -66,7 +70,6 @@
|
||||
* - should we do anything special for STB_WEAK symbols?
|
||||
* - are we doing everything we should for ARM_COPY relocations?
|
||||
* - cleaner error reporting
|
||||
* - configuration for paths (LD_LIBRARY_PATH?)
|
||||
* - after linking, set as much stuff as possible to READONLY
|
||||
* and NOEXEC
|
||||
* - 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 *sonext = &libdl_info;
|
||||
|
||||
static char ldpaths_buf[LDPATH_BUFSIZE];
|
||||
static const char *ldpaths[LDPATH_MAX + 1];
|
||||
|
||||
int debug_verbosity;
|
||||
static int pid;
|
||||
|
||||
@ -104,6 +110,32 @@ unsigned bitmask[4096];
|
||||
#define PT_ARM_EXIDX 0x70000001 /* .ARM.exidx segment */
|
||||
#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
|
||||
* about linker activity.
|
||||
@ -207,7 +239,7 @@ static soinfo *alloc_info(const char *name)
|
||||
soinfo *si;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -216,7 +248,7 @@ static soinfo *alloc_info(const char *name)
|
||||
*/
|
||||
if (!freelist) {
|
||||
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;
|
||||
}
|
||||
freelist = sopool + socount++;
|
||||
@ -252,7 +284,7 @@ static void free_info(soinfo *si)
|
||||
}
|
||||
if (trav == NULL) {
|
||||
/* 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;
|
||||
}
|
||||
|
||||
@ -477,13 +509,12 @@ static int _open_lib(const char *name)
|
||||
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)
|
||||
{
|
||||
int fd;
|
||||
char buf[512];
|
||||
const char **path;
|
||||
int n;
|
||||
|
||||
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))
|
||||
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++) {
|
||||
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)
|
||||
return fd;
|
||||
}
|
||||
@ -521,7 +565,7 @@ is_prelinked(int fd, const char *name)
|
||||
|
||||
sz = lseek(fd, -sizeof(prelink_info_t), SEEK_END);
|
||||
if (sz < 0) {
|
||||
ERROR("lseek() failed!\n");
|
||||
DL_ERR("lseek() failed!\n");
|
||||
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);
|
||||
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;
|
||||
}
|
||||
|
||||
@ -625,7 +669,7 @@ get_lib_extents(int fd, const char *name, void *__hdr, unsigned *total_sz)
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -661,13 +705,13 @@ static int reserve_mem_region(soinfo *si)
|
||||
void *base = mmap((void *)si->base, si->size, PROT_READ | PROT_EXEC,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||
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",
|
||||
pid, (si->base ? "" : "non-"), si->name, si->base,
|
||||
errno, strerror(errno));
|
||||
return -1;
|
||||
} 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-"),
|
||||
si->name, (unsigned)base, si->base);
|
||||
munmap(base, si->size);
|
||||
@ -705,7 +749,7 @@ alloc_mem_region(soinfo *si)
|
||||
}
|
||||
|
||||
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);
|
||||
return -1;
|
||||
}
|
||||
@ -764,7 +808,7 @@ load_segments(int fd, void *header, soinfo *si)
|
||||
MAP_PRIVATE | MAP_FIXED, fd,
|
||||
phdr->p_offset & (~PAGE_MASK));
|
||||
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,
|
||||
(unsigned)tmp, len, phdr->p_vaddr, phdr->p_offset);
|
||||
goto fail;
|
||||
@ -820,8 +864,8 @@ load_segments(int fd, void *header, soinfo *si)
|
||||
MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS,
|
||||
-1, 0);
|
||||
if (extra_base == MAP_FAILED) {
|
||||
ERROR("[ %5d - failed to extend segment from '%s' @ 0x%08x "
|
||||
"(0x%08x) ]\n", pid, si->name, (unsigned)tmp,
|
||||
DL_ERR("[ %5d - failed to extend segment from '%s' @ 0x%08x"
|
||||
" (0x%08x) ]\n", pid, si->name, (unsigned)tmp,
|
||||
extra_len);
|
||||
goto fail;
|
||||
}
|
||||
@ -873,7 +917,7 @@ load_segments(int fd, void *header, soinfo *si)
|
||||
|
||||
/* Sanity check */
|
||||
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",
|
||||
pid, total_sz, si->name, si->size);
|
||||
goto fail;
|
||||
@ -940,18 +984,20 @@ load_library(const char *name)
|
||||
soinfo *si = NULL;
|
||||
Elf32_Ehdr *hdr;
|
||||
|
||||
if(fd == -1)
|
||||
if(fd == -1) {
|
||||
DL_ERR("Library '%s' not found\n", name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* We have to read the ELF header to figure out what to do with this image
|
||||
*/
|
||||
if (lseek(fd, 0, SEEK_SET) < 0) {
|
||||
ERROR("lseek() failed!\n");
|
||||
DL_ERR("lseek() failed!\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if ((cnt = read(fd, &__header[0], PAGE_SIZE)) < 0) {
|
||||
ERROR("read() failed!\n");
|
||||
DL_ERR("read() failed!\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@ -1042,8 +1088,8 @@ soinfo *find_library(const char *name)
|
||||
if(!strcmp(name, si->name)) {
|
||||
if(si->flags & FLAG_ERROR) return 0;
|
||||
if(si->flags & FLAG_LINKED) return si;
|
||||
ERROR("OOPS: %5d recursive link to '%s'\n", pid, si->name);
|
||||
return 0;
|
||||
DL_ERR("OOPS: %5d recursive link to '%s'\n", pid, si->name);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1074,7 +1120,7 @@ unsigned unload_library(soinfo *si)
|
||||
if(lsi)
|
||||
unload_library(lsi);
|
||||
else
|
||||
ERROR("%5d could not unload '%s'\n",
|
||||
DL_ERR("%5d could not unload '%s'\n",
|
||||
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,
|
||||
si->name, idx);
|
||||
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) {
|
||||
ERROR("%5d cannot locate '%s'...\n", pid, sym_name);
|
||||
DL_ERR("%5d cannot locate '%s'...\n", pid, sym_name);
|
||||
return -1;
|
||||
}
|
||||
#if 0
|
||||
if((base == 0) && (si->base != 0)){
|
||||
/* 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);
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
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,
|
||||
s->st_value);
|
||||
return -1;
|
||||
}
|
||||
sym_addr = (unsigned)(s->st_value + base);
|
||||
sym_name = (char *)(strtab + symtab[sym].st_name);
|
||||
COUNT_RELOC(RELOC_SYMBOL);
|
||||
} else {
|
||||
s = 0;
|
||||
@ -1198,7 +1244,7 @@ static int reloc_library(soinfo *si, Elf32_Rel *rel, unsigned count)
|
||||
COUNT_RELOC(RELOC_RELATIVE);
|
||||
MARK(rel->r_offset);
|
||||
if(sym){
|
||||
ERROR("%5d odd RELATIVE form...\n", pid);
|
||||
DL_ERR("%5d odd RELATIVE form...\n", pid);
|
||||
return -1;
|
||||
}
|
||||
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 */
|
||||
|
||||
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));
|
||||
return -1;
|
||||
}
|
||||
@ -1248,13 +1294,38 @@ static int reloc_library(soinfo *si, Elf32_Rel *rel, unsigned count)
|
||||
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;
|
||||
for(n = count; n > 0; n--){
|
||||
TRACE("[ %5d Looking at ctor *0x%08x == 0x%08x ]\n", pid,
|
||||
int n, inc = 1;
|
||||
|
||||
if (reverse) {
|
||||
ctor += (count-1);
|
||||
inc = -1;
|
||||
}
|
||||
|
||||
for(n = count; n > 0; n--) {
|
||||
TRACE("[ %5d Looking at %s *0x%08x == 0x%08x ]\n", pid,
|
||||
reverse ? "dtor" : "ctor",
|
||||
(unsigned)ctor, (unsigned)*ctor);
|
||||
void (*func)() = (void (*)()) *ctor++;
|
||||
void (*func)() = (void (*)()) *ctor;
|
||||
ctor += inc;
|
||||
if(((int) func == 0) || ((int) func == -1)) continue;
|
||||
TRACE("[ %5d Calling func @ 0x%08x ]\n", pid, (unsigned)func);
|
||||
func();
|
||||
@ -1263,31 +1334,20 @@ static void call_array(unsigned *ctor, int count)
|
||||
|
||||
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) {
|
||||
TRACE("[ %5d Calling preinit_array @ 0x%08x [%d] for '%s' ]\n",
|
||||
pid, (unsigned)si->preinit_array, si->preinit_array_count,
|
||||
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);
|
||||
} else {
|
||||
if (si->preinit_array) {
|
||||
ERROR("%5d Shared library '%s' has a preinit_array table @ 0x%08x."
|
||||
" This is INVALID.\n", pid, si->name,
|
||||
(unsigned)si->preinit_array);
|
||||
DL_ERR("%5d Shared library '%s' has a preinit_array table @ 0x%08x."
|
||||
" This is INVALID.\n", pid, si->name,
|
||||
(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) {
|
||||
TRACE("[ %5d Calling init_func @ 0x%08x for '%s' ]\n", pid,
|
||||
(unsigned)si->init_func, si->name);
|
||||
@ -1298,25 +1358,21 @@ static void call_constructors(soinfo *si)
|
||||
if (si->init_array) {
|
||||
TRACE("[ %5d Calling init_array @ 0x%08x [%d] for '%s' ]\n", pid,
|
||||
(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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void call_destructors(soinfo *si)
|
||||
{
|
||||
if (si->fini_array) {
|
||||
TRACE("[ %5d Calling fini_array @ 0x%08x [%d] for '%s' ]\n", pid,
|
||||
(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);
|
||||
}
|
||||
|
||||
// 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) {
|
||||
TRACE("[ %5d Calling fini_func @ 0x%08x for '%s' ]\n", pid,
|
||||
(unsigned)si->fini_func, si->name);
|
||||
@ -1334,7 +1390,7 @@ static int nullify_closed_stdio (void)
|
||||
|
||||
dev_null = open("/dev/null", O_RDWR);
|
||||
if (dev_null < 0) {
|
||||
ERROR("Cannot open /dev/null.\n");
|
||||
DL_ERR("Cannot open /dev/null.\n");
|
||||
return -1;
|
||||
}
|
||||
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
|
||||
exist, in which case we dup /dev/null to it. */
|
||||
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;
|
||||
continue;
|
||||
}
|
||||
@ -1371,9 +1427,9 @@ static int nullify_closed_stdio (void)
|
||||
do {
|
||||
status = dup2(dev_null, i);
|
||||
} while (status < 0 && errno == EINTR);
|
||||
|
||||
|
||||
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;
|
||||
continue;
|
||||
}
|
||||
@ -1382,12 +1438,12 @@ static int nullify_closed_stdio (void)
|
||||
/* If /dev/null is not one of the stdio file descriptors, close it. */
|
||||
if (dev_null > 2) {
|
||||
TRACE("[ %5d Closing /dev/null file-descriptor=%d]\n", pid, dev_null);
|
||||
do {
|
||||
do {
|
||||
status = close(dev_null);
|
||||
} while (status < 0 && errno == EINTR);
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -1455,7 +1511,7 @@ static int link_image(soinfo *si, unsigned wr_offset)
|
||||
}
|
||||
} else if (phdr->p_type == PT_DYNAMIC) {
|
||||
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",
|
||||
pid, si->name, si->base + phdr->p_vaddr,
|
||||
(unsigned)si->dynamic);
|
||||
@ -1468,7 +1524,7 @@ static int link_image(soinfo *si, unsigned wr_offset)
|
||||
}
|
||||
|
||||
if (si->dynamic == (unsigned *)-1) {
|
||||
ERROR("%5d missing PT_DYNAMIC?!\n", pid);
|
||||
DL_ERR("%5d missing PT_DYNAMIC?!\n", pid);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@ -1492,7 +1548,7 @@ static int link_image(soinfo *si, unsigned wr_offset)
|
||||
break;
|
||||
case DT_PLTREL:
|
||||
if(*d != DT_REL) {
|
||||
ERROR("DT_RELA not supported\n");
|
||||
DL_ERR("DT_RELA not supported\n");
|
||||
goto fail;
|
||||
}
|
||||
break;
|
||||
@ -1517,7 +1573,7 @@ static int link_image(soinfo *si, unsigned wr_offset)
|
||||
*d = (int) &_r_debug;
|
||||
break;
|
||||
case DT_RELA:
|
||||
ERROR("%5d DT_RELA not supported\n", pid);
|
||||
DL_ERR("%5d DT_RELA not supported\n", pid);
|
||||
goto fail;
|
||||
case DT_INIT:
|
||||
si->init_func = (void (*)(void))(si->base + *d);
|
||||
@ -1569,16 +1625,18 @@ static int link_image(soinfo *si, unsigned wr_offset)
|
||||
pid, si->base, si->strtab, si->symtab);
|
||||
|
||||
if((si->strtab == 0) || (si->symtab == 0)) {
|
||||
ERROR("%5d missing essential tables\n", pid);
|
||||
DL_ERR("%5d missing essential tables\n", pid);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
for(d = si->dynamic; *d; d += 2) {
|
||||
if(d[0] == DT_NEEDED){
|
||||
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) {
|
||||
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;
|
||||
}
|
||||
lsi->refcount++;
|
||||
@ -1643,6 +1701,29 @@ fail:
|
||||
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)
|
||||
{
|
||||
return 0;
|
||||
@ -1661,6 +1742,7 @@ unsigned __linker_init(unsigned **elfdata)
|
||||
unsigned *vecs = (unsigned*) (argv + argc + 1);
|
||||
soinfo *si;
|
||||
struct link_map * map;
|
||||
char *ldpath_env = NULL;
|
||||
|
||||
pid = getpid();
|
||||
|
||||
@ -1678,6 +1760,8 @@ unsigned __linker_init(unsigned **elfdata)
|
||||
while(vecs[0] != 0) {
|
||||
if(!strncmp((char*) vecs[0], "DEBUG=", 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++;
|
||||
}
|
||||
@ -1737,8 +1821,14 @@ unsigned __linker_init(unsigned **elfdata)
|
||||
si->wrprotect_start = 0xffffffff;
|
||||
si->wrprotect_end = 0;
|
||||
|
||||
if(link_image(si, 0)){
|
||||
ERROR("CANNOT LINK EXECUTABLE '%s'\n", argv[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)) {
|
||||
char errmsg[] = "CANNOT LINK EXECUTABLE\n";
|
||||
write(2, __linker_dl_err_buf, strlen(__linker_dl_err_buf));
|
||||
write(2, errmsg, sizeof(errmsg));
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
|
@ -204,6 +204,7 @@ soinfo *find_library(const char *name);
|
||||
unsigned unload_library(soinfo *si);
|
||||
Elf32_Sym *lookup_in_library(soinfo *si, const char *name);
|
||||
Elf32_Sym *lookup(const char *name, unsigned *base);
|
||||
const char *linker_get_error(void);
|
||||
|
||||
#ifdef ANDROID_ARM_LINKER
|
||||
typedef long unsigned int *_Unwind_Ptr;
|
||||
|
@ -55,17 +55,16 @@
|
||||
#define TRUE 1
|
||||
#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
|
||||
* corruption when the linker uses printf().
|
||||
*/
|
||||
#if LINKER_DEBUG
|
||||
extern int debug_verbosity;
|
||||
#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 */
|
||||
#define _PRINTVF(v,f,x...) do {} while(0)
|
||||
#endif /* LINKER_DEBUG */
|
||||
@ -75,8 +74,9 @@ extern int debug_verbosity;
|
||||
#define TRACE(x...) _PRINTVF(1, TRUE, x)
|
||||
#define WARN(fmt,args...) \
|
||||
_PRINTVF(-1, TRUE, "%s:%d| WARNING: " fmt, __FILE__, __LINE__, ## args)
|
||||
#define ERROR(fmt,args...) \
|
||||
__PRINTVF(-1, TRUE, "%s:%d| ERROR: " fmt, __FILE__, __LINE__, ## args)
|
||||
#define ERROR(fmt,args...) \
|
||||
_PRINTVF(-1, TRUE, "%s:%d| ERROR: " fmt, __FILE__, __LINE__, ## args)
|
||||
|
||||
|
||||
#if TRACE_DEBUG
|
||||
#define DEBUG(x...) _PRINTVF(2, TRUE, "DEBUG: " x)
|
||||
|
Loading…
x
Reference in New Issue
Block a user