1 | // Copyright (c) 2011, 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 | // elf_core_dump.h: Define the google_breakpad::ElfCoreDump class, which |
31 | // encapsulates an ELF core dump file mapped into memory. |
32 | |
33 | #ifndef COMMON_LINUX_ELF_CORE_DUMP_H_ |
34 | #define COMMON_LINUX_ELF_CORE_DUMP_H_ |
35 | |
36 | #include <elf.h> |
37 | #include <limits.h> |
38 | #include <link.h> |
39 | #include <stddef.h> |
40 | |
41 | #include "common/memory_range.h" |
42 | |
43 | namespace google_breakpad { |
44 | |
45 | // A class encapsulating an ELF core dump file mapped into memory, which |
46 | // provides methods for accessing program headers and the note section. |
47 | class ElfCoreDump { |
48 | public: |
49 | // ELF types based on the native word size. |
50 | typedef ElfW(Ehdr) Ehdr; |
51 | typedef ElfW(Nhdr) Nhdr; |
52 | typedef ElfW(Phdr) Phdr; |
53 | typedef ElfW(Word) Word; |
54 | typedef ElfW(Addr) Addr; |
55 | #if ULONG_MAX == 0xffffffff |
56 | static const int kClass = ELFCLASS32; |
57 | #elif ULONG_MAX == 0xffffffffffffffff |
58 | static const int kClass = ELFCLASS64; |
59 | #else |
60 | #error "Unsupported word size for ElfCoreDump." |
61 | #endif |
62 | |
63 | // A class encapsulating the note content in a core dump, which provides |
64 | // methods for accessing the name and description of a note. |
65 | class Note { |
66 | public: |
67 | Note(); |
68 | |
69 | // Constructor that takes the note content from |content|. |
70 | explicit Note(const MemoryRange& content); |
71 | |
72 | // Returns true if this note is valid, i,e. a note header is found in |
73 | // |content_|, or false otherwise. |
74 | bool IsValid() const; |
75 | |
76 | // Returns the note header, or NULL if no note header is found in |
77 | // |content_|. |
78 | const Nhdr* () const; |
79 | |
80 | // Returns the note type, or 0 if no note header is found in |content_|. |
81 | Word GetType() const; |
82 | |
83 | // Returns a memory range covering the note name, or an empty range |
84 | // if no valid note name is found in |content_|. |
85 | MemoryRange GetName() const; |
86 | |
87 | // Returns a memory range covering the note description, or an empty |
88 | // range if no valid note description is found in |content_|. |
89 | MemoryRange GetDescription() const; |
90 | |
91 | // Returns the note following this note, or an empty note if no valid |
92 | // note is found after this note. |
93 | Note GetNextNote() const; |
94 | |
95 | private: |
96 | // Returns the size in bytes round up to the word alignment, specified |
97 | // for the note section, of a given size in bytes. |
98 | static size_t AlignedSize(size_t size); |
99 | |
100 | // Note content. |
101 | MemoryRange content_; |
102 | }; |
103 | |
104 | ElfCoreDump(); |
105 | |
106 | // Constructor that takes the core dump content from |content|. |
107 | explicit ElfCoreDump(const MemoryRange& content); |
108 | |
109 | ~ElfCoreDump(); |
110 | |
111 | // Sets the core dump content to |content|. |
112 | void SetContent(const MemoryRange& content); |
113 | |
114 | // Returns true if a valid ELF header in the core dump, or false otherwise. |
115 | bool IsValid() const; |
116 | |
117 | // Returns the ELF header in the core dump, or NULL if no ELF header |
118 | // is found in |content_|. |
119 | const Ehdr* () const; |
120 | |
121 | // Returns the |index|-th program header in the core dump, or NULL if no |
122 | // ELF header is found in |content_| or |index| is out of bounds. |
123 | const Phdr* (unsigned index) const; |
124 | |
125 | // Returns the first program header of |type| in the core dump, or NULL if |
126 | // no ELF header is found in |content_| or no program header of |type| is |
127 | // found. |
128 | const Phdr* (Word type) const; |
129 | |
130 | // Returns the number of program headers in the core dump, or 0 if no |
131 | // ELF header is found in |content_|. |
132 | unsigned () const; |
133 | |
134 | // Copies |length| bytes of data starting at |virtual_address| in the core |
135 | // dump to |buffer|. |buffer| should be a valid pointer to a buffer of at |
136 | // least |length| bytes. Returns true if the data to be copied is found in |
137 | // the core dump, or false otherwise. |
138 | bool CopyData(void* buffer, Addr virtual_address, size_t length); |
139 | |
140 | // Returns the first note found in the note section of the core dump, or |
141 | // an empty note if no note is found. |
142 | Note GetFirstNote() const; |
143 | |
144 | // Sets the mem fd. |
145 | void SetProcMem(const int fd); |
146 | |
147 | private: |
148 | // Core dump content. |
149 | MemoryRange content_; |
150 | |
151 | // Descriptor for /proc/<pid>/mem. |
152 | int proc_mem_fd_; |
153 | }; |
154 | |
155 | } // namespace google_breakpad |
156 | |
157 | #endif // COMMON_LINUX_ELF_CORE_DUMP_H_ |
158 | |