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