elfutils.h revision c71d9b4e80f47028a86b0392ba3b7c8d66590664
1// Copyright (c) 2012, Google Inc. 2// All rights reserved. 3// 4// Redistribution and use in source and binary forms, with or without 5// modification, are permitted provided that the following conditions are 6// met: 7// 8// * Redistributions of source code must retain the above copyright 9// notice, this list of conditions and the following disclaimer. 10// * Redistributions in binary form must reproduce the above 11// copyright notice, this list of conditions and the following disclaimer 12// in the documentation and/or other materials provided with the 13// distribution. 14// * Neither the name of Google Inc. nor the names of its 15// contributors may be used to endorse or promote products derived from 16// this software without specific prior written permission. 17// 18// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29// 30// elfutils.h: Utilities for dealing with ELF files. 31// 32 33#ifndef COMMON_LINUX_ELFUTILS_H__ 34#define COMMON_LINUX_ELFUTILS_H__ 35 36#if defined(__ANDROID__) 37#include <linux/elf.h> 38#include "client/linux/android_link.h" 39#else 40#include <elf.h> 41#include <link.h> 42#endif 43#include <stdint.h> 44 45namespace google_breakpad { 46 47// Traits classes so consumers can write templatized code to deal 48// with specific ELF bits. 49struct ElfClass32 { 50 typedef Elf32_Addr Addr; 51 typedef Elf32_Ehdr Ehdr; 52 typedef Elf32_Nhdr Nhdr; 53 typedef Elf32_Phdr Phdr; 54 typedef Elf32_Shdr Shdr; 55 static const int kClass = ELFCLASS32; 56}; 57 58struct ElfClass64 { 59 typedef Elf64_Addr Addr; 60 typedef Elf64_Ehdr Ehdr; 61 typedef Elf64_Nhdr Nhdr; 62 typedef Elf64_Phdr Phdr; 63 typedef Elf64_Shdr Shdr; 64 static const int kClass = ELFCLASS64; 65}; 66 67// Attempt to find a section named |section_name| of type |section_type| 68// in the ELF binary data at |elf_mapped_base|. On success, returns true 69// and sets |*section_start| to point to the start of the section data, 70// and |*section_size| to the size of the section's data. If |elfclass| 71// is not NULL, set |*elfclass| to the ELF file class. 72bool FindElfSection(const void *elf_mapped_base, 73 const char *section_name, 74 uint32_t section_type, 75 const void **section_start, 76 int *section_size, 77 int *elfclass); 78 79} // namespace google_breakpad 80 81#endif // COMMON_LINUX_ELFUTILS_H__ 82