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