diff options
author | Elliott Hughes <enh@google.com> | 2014-02-10 17:46:57 -0800 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2014-02-10 18:22:24 -0800 |
commit | 0266ae5f884d72da58f33a072e865ba131234a5e (patch) | |
tree | 48763b706806f544b1dec0ef98261bed6f21dee2 /libc/bionic | |
parent | eeb9a9f59a58a2f042e8f6fd1a4911ae92ac5493 (diff) | |
download | bionic-0266ae5f884d72da58f33a072e865ba131234a5e.zip bionic-0266ae5f884d72da58f33a072e865ba131234a5e.tar.gz bionic-0266ae5f884d72da58f33a072e865ba131234a5e.tar.bz2 |
Switch <elf.h> over to linux uapi under the covers.
Remove the linker's reliance on BSD cruft and use the glibc-style
ElfW macro. (Other code too, but the linker contains the majority
of the code that needs to work for Elf32 and Elf64.)
All platforms need dl_iterate_phdr_static, so it doesn't make sense
to have that part of the per-architecture configuration.
Bug: 12476126
Change-Id: I1d7f918f1303a392794a6cd8b3512ff56bd6e487
Diffstat (limited to 'libc/bionic')
-rw-r--r-- | libc/bionic/dl_iterate_phdr_static.c | 82 | ||||
-rw-r--r-- | libc/bionic/dl_iterate_phdr_static.cpp | 82 | ||||
-rw-r--r-- | libc/bionic/getauxval.cpp | 4 | ||||
-rw-r--r-- | libc/bionic/libc_init_static.cpp | 8 |
4 files changed, 88 insertions, 88 deletions
diff --git a/libc/bionic/dl_iterate_phdr_static.c b/libc/bionic/dl_iterate_phdr_static.c deleted file mode 100644 index d03d3d2..0000000 --- a/libc/bionic/dl_iterate_phdr_static.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <elf.h> -#include <sys/auxv.h> -#include <sys/types.h> -#include <link.h> - -/* ld provides this to us in the default link script */ -extern void* __executable_start; - -int dl_iterate_phdr(int (*cb)(struct dl_phdr_info* info, size_t size, void* data), void* data) { - Elf_Ehdr* ehdr = (Elf_Ehdr*) &__executable_start; - - // TODO: again, copied from linker.c. Find a better home for this later. - if (ehdr->e_ident[EI_MAG0] != ELFMAG0) return -1; - if (ehdr->e_ident[EI_MAG1] != ELFMAG1) return -1; - if (ehdr->e_ident[EI_MAG2] != ELFMAG2) return -1; - if (ehdr->e_ident[EI_MAG3] != ELFMAG3) return -1; - - // Dynamic binaries get their dl_iterate_phdr from the dynamic linker, but - // static binaries get this. We don't have a list of shared objects to - // iterate over, since there's really only a single monolithic blob of - // code/data, plus optionally a VDSO. - - struct dl_phdr_info exe_info; - exe_info.dlpi_addr = 0; - exe_info.dlpi_name = NULL; - exe_info.dlpi_phdr = (Elf_Phdr*) ((unsigned long) ehdr + ehdr->e_phoff); - exe_info.dlpi_phnum = ehdr->e_phnum; - -#ifdef AT_SYSINFO_EHDR - // Try the executable first. - int rc = cb(&exe_info, sizeof(exe_info), data); - if (rc != 0) { - return rc; - } - - // Try the VDSO if that didn't work. - Elf_Ehdr* ehdr_vdso = (Elf_Ehdr*) getauxval(AT_SYSINFO_EHDR); - struct dl_phdr_info vdso_info; - vdso_info.dlpi_addr = 0; - vdso_info.dlpi_name = NULL; - vdso_info.dlpi_phdr = (Elf_Phdr*) ((char*) ehdr_vdso + ehdr_vdso->e_phoff); - vdso_info.dlpi_phnum = ehdr_vdso->e_phnum; - for (size_t i = 0; i < vdso_info.dlpi_phnum; ++i) { - if (vdso_info.dlpi_phdr[i].p_type == PT_LOAD) { - vdso_info.dlpi_addr = (Elf_Addr) ehdr_vdso - vdso_info.dlpi_phdr[i].p_vaddr; - break; - } - } - return cb(&vdso_info, sizeof(vdso_info), data); -#else - // There's only the executable to try. - return cb(&exe_info, sizeof(exe_info), data); -#endif -} diff --git a/libc/bionic/dl_iterate_phdr_static.cpp b/libc/bionic/dl_iterate_phdr_static.cpp new file mode 100644 index 0000000..7e9eedd --- /dev/null +++ b/libc/bionic/dl_iterate_phdr_static.cpp @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <elf.h> +#include <sys/auxv.h> +#include <sys/types.h> +#include <link.h> + +/* ld provides this to us in the default link script */ +extern "C" void* __executable_start; + +int dl_iterate_phdr(int (*cb)(struct dl_phdr_info* info, size_t size, void* data), void* data) { + ElfW(Ehdr)* ehdr = reinterpret_cast<ElfW(Ehdr)*>(&__executable_start); + + // TODO: again, copied from linker.c. Find a better home for this later. + if (ehdr->e_ident[EI_MAG0] != ELFMAG0) return -1; + if (ehdr->e_ident[EI_MAG1] != ELFMAG1) return -1; + if (ehdr->e_ident[EI_MAG2] != ELFMAG2) return -1; + if (ehdr->e_ident[EI_MAG3] != ELFMAG3) return -1; + + // Dynamic binaries get their dl_iterate_phdr from the dynamic linker, but + // static binaries get this. We don't have a list of shared objects to + // iterate over, since there's really only a single monolithic blob of + // code/data, plus optionally a VDSO. + + struct dl_phdr_info exe_info; + exe_info.dlpi_addr = 0; + exe_info.dlpi_name = NULL; + exe_info.dlpi_phdr = reinterpret_cast<ElfW(Phdr)*>(reinterpret_cast<uintptr_t>(ehdr) + ehdr->e_phoff); + exe_info.dlpi_phnum = ehdr->e_phnum; + +#ifdef AT_SYSINFO_EHDR + // Try the executable first. + int rc = cb(&exe_info, sizeof(exe_info), data); + if (rc != 0) { + return rc; + } + + // Try the VDSO if that didn't work. + ElfW(Ehdr)* ehdr_vdso = reinterpret_cast<ElfW(Ehdr)*>(getauxval(AT_SYSINFO_EHDR)); + struct dl_phdr_info vdso_info; + vdso_info.dlpi_addr = 0; + vdso_info.dlpi_name = NULL; + vdso_info.dlpi_phdr = reinterpret_cast<ElfW(Phdr)*>(reinterpret_cast<char*>(ehdr_vdso) + ehdr_vdso->e_phoff); + vdso_info.dlpi_phnum = ehdr_vdso->e_phnum; + for (size_t i = 0; i < vdso_info.dlpi_phnum; ++i) { + if (vdso_info.dlpi_phdr[i].p_type == PT_LOAD) { + vdso_info.dlpi_addr = (ElfW(Addr)) ehdr_vdso - vdso_info.dlpi_phdr[i].p_vaddr; + break; + } + } + return cb(&vdso_info, sizeof(vdso_info), data); +#else + // There's only the executable to try. + return cb(&exe_info, sizeof(exe_info), data); +#endif +} diff --git a/libc/bionic/getauxval.cpp b/libc/bionic/getauxval.cpp index 3ee31d6..bc41824 100644 --- a/libc/bionic/getauxval.cpp +++ b/libc/bionic/getauxval.cpp @@ -32,10 +32,10 @@ #include <private/bionic_auxv.h> #include <elf.h> -__LIBC_HIDDEN__ Elf_auxv_t* __libc_auxv = NULL; +__LIBC_HIDDEN__ ElfW(auxv_t)* __libc_auxv = NULL; extern "C" unsigned long int getauxval(unsigned long int type) { - for (Elf_auxv_t* v = __libc_auxv; v->a_type != AT_NULL; ++v) { + for (ElfW(auxv_t)* v = __libc_auxv; v->a_type != AT_NULL; ++v) { if (v->a_type == type) { return v->a_un.a_val; } diff --git a/libc/bionic/libc_init_static.cpp b/libc/bionic/libc_init_static.cpp index 1825167..e45422e 100644 --- a/libc/bionic/libc_init_static.cpp +++ b/libc/bionic/libc_init_static.cpp @@ -68,16 +68,16 @@ static void call_array(void(**list)()) { } static void apply_gnu_relro() { - Elf_Phdr* phdr_start = reinterpret_cast<Elf_Phdr*>(getauxval(AT_PHDR)); + ElfW(Phdr)* phdr_start = reinterpret_cast<ElfW(Phdr)*>(getauxval(AT_PHDR)); unsigned long int phdr_ct = getauxval(AT_PHNUM); - for (Elf_Phdr* phdr = phdr_start; phdr < (phdr_start + phdr_ct); phdr++) { + for (ElfW(Phdr)* phdr = phdr_start; phdr < (phdr_start + phdr_ct); phdr++) { if (phdr->p_type != PT_GNU_RELRO) { continue; } - Elf_Addr seg_page_start = PAGE_START(phdr->p_vaddr); - Elf_Addr seg_page_end = PAGE_END(phdr->p_vaddr + phdr->p_memsz); + ElfW(Addr) seg_page_start = PAGE_START(phdr->p_vaddr); + ElfW(Addr) seg_page_end = PAGE_END(phdr->p_vaddr + phdr->p_memsz); // Check return value here? What do we do if we fail? mprotect(reinterpret_cast<void*>(seg_page_start), seg_page_end - seg_page_start, PROT_READ); |