From b7beb6907599b36809effe1b4db76039ac649518 Mon Sep 17 00:00:00 2001 From: Pavel Chupin Date: Fri, 17 Aug 2012 12:53:29 +0400 Subject: [PATCH] Add link.h for all platforms with dl_phdr_info This header is used on bionic build and should be propagated into sysroot on toolchain rebuild. Discussion re. this header is here: http://gcc.gnu.org/ml/gcc-patches/2012-08/msg00936.html It is available already in mips NDK platforms: development/ndk/platforms/android-9/arch-mips/include/link.h Change-Id: I39ff467cdac9f448e31c11ee3e14a6200e82ab57 Signed-off-by: Pavel Chupin --- libc/arch-arm/bionic/exidx_dynamic.c | 6 +-- libc/arch-arm/bionic/exidx_static.c | 3 +- libc/bionic/dl_iterate_phdr_static.c | 11 +----- libc/include/link.h | 55 ++++++++++++++++++++++++++++ linker/linker.h | 18 +-------- 5 files changed, 60 insertions(+), 33 deletions(-) create mode 100644 libc/include/link.h diff --git a/libc/arch-arm/bionic/exidx_dynamic.c b/libc/arch-arm/bionic/exidx_dynamic.c index 962606f87..c7b7156b0 100644 --- a/libc/arch-arm/bionic/exidx_dynamic.c +++ b/libc/arch-arm/bionic/exidx_dynamic.c @@ -25,12 +25,8 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ -typedef long unsigned int *_Unwind_Ptr; -/* Stubbed out in libdl and defined in the dynamic linker. - * Same semantics as __gnu_Unwind_Find_exidx(). - */ -extern _Unwind_Ptr dl_unwind_find_exidx(_Unwind_Ptr pc, int *pcount); +#include /* For a given PC, find the .so that it belongs to. * Returns the base address of the .ARM.exidx section diff --git a/libc/arch-arm/bionic/exidx_static.c b/libc/arch-arm/bionic/exidx_static.c index e79e9516d..72c0a5bc0 100644 --- a/libc/arch-arm/bionic/exidx_static.c +++ b/libc/arch-arm/bionic/exidx_static.c @@ -25,7 +25,8 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ -typedef long unsigned int *_Unwind_Ptr; + +#include /* Find the .ARM.exidx section (which in the case of a static executable * can be identified through its start and end symbols), and return its diff --git a/libc/bionic/dl_iterate_phdr_static.c b/libc/bionic/dl_iterate_phdr_static.c index 4eecff6fc..b8ef9e940 100644 --- a/libc/bionic/dl_iterate_phdr_static.c +++ b/libc/bionic/dl_iterate_phdr_static.c @@ -28,16 +28,7 @@ #include #include - -/* TODO: Move this into a header that linker.h can also pull it in. - * Silly to have same struct in 2 places. This is temporary. */ -struct dl_phdr_info -{ - Elf32_Addr dlpi_addr; - const char *dlpi_name; - const Elf32_Phdr *dlpi_phdr; - Elf32_Half dlpi_phnum; -}; +#include /* Dynamic binaries get this from the dynamic linker (system/linker), which * we don't pull in for static bins. We also don't have a list of so's to diff --git a/libc/include/link.h b/libc/include/link.h new file mode 100644 index 000000000..842b4483d --- /dev/null +++ b/libc/include/link.h @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2012 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 _LINK_H_ +#define _LINK_H_ + +#include +#include + +__BEGIN_DECLS + +/* bionic is currently only 32-bit. */ +#define ElfW(type) Elf32_##type + +struct dl_phdr_info { + ElfW(Addr) dlpi_addr; + const char* dlpi_name; + const ElfW(Phdr)* dlpi_phdr; + ElfW(Half) dlpi_phnum; +}; + +#ifdef __arm__ +typedef long unsigned int* _Unwind_Ptr; +_Unwind_Ptr dl_unwind_find_exidx(_Unwind_Ptr pc, int* pcount); +#else +int dl_iterate_phdr(int (*cb)(struct dl_phdr_info*, size_t, void*), void*); +#endif + +__END_DECLS + +#endif /* _LINK_H_ */ diff --git a/linker/linker.h b/linker/linker.h index 296dcd627..8ed433cf1 100644 --- a/linker/linker.h +++ b/linker/linker.h @@ -37,6 +37,7 @@ #ifdef __cplusplus extern "C" { #endif +#include #undef PAGE_MASK #undef PAGE_SIZE @@ -72,16 +73,6 @@ struct link_map struct link_map * l_prev; }; -/* needed for dl_iterate_phdr to be passed to the callbacks provided */ -struct dl_phdr_info -{ - Elf32_Addr dlpi_addr; - const char *dlpi_name; - const Elf32_Phdr *dlpi_phdr; - Elf32_Half dlpi_phnum; -}; - - // Values for r_debug->state enum { RT_CONSISTENT, @@ -241,13 +232,6 @@ Elf32_Sym *soinfo_find_symbol(soinfo* si, const void *addr); Elf32_Sym *soinfo_lookup(soinfo *si, const char *name); void soinfo_call_constructors(soinfo *si); -#if defined(ANDROID_ARM_LINKER) -typedef long unsigned int *_Unwind_Ptr; -_Unwind_Ptr dl_unwind_find_exidx(_Unwind_Ptr pc, int *pcount); -#elif defined(ANDROID_X86_LINKER) || defined(ANDROID_MIPS_LINKER) -int dl_iterate_phdr(int (*cb)(struct dl_phdr_info *, size_t, void *), void *); -#endif - #ifdef __cplusplus }; #endif