186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// Copyright (c) 2011, Google Inc. 286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// All rights reserved. 386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// 486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// Redistribution and use in source and binary forms, with or without 586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// modification, are permitted provided that the following conditions are 686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// met: 786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// 886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// * Redistributions of source code must retain the above copyright 986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// notice, this list of conditions and the following disclaimer. 1086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// * Redistributions in binary form must reproduce the above 1186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// copyright notice, this list of conditions and the following disclaimer 1286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// in the documentation and/or other materials provided with the 1386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// distribution. 1486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// * Neither the name of Google Inc. nor the names of its 1586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// contributors may be used to endorse or promote products derived from 1686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// this software without specific prior written permission. 1786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// 1886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 3086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// elf_core_dump.h: Define the google_breakpad::ElfCoreDump class, which 3186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// encapsulates an ELF core dump file mapped into memory. 3286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 3386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#ifndef COMMON_LINUX_ELF_CORE_DUMP_H_ 3486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#define COMMON_LINUX_ELF_CORE_DUMP_H_ 3586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 3686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#include <elf.h> 3786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#include <link.h> 3886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#include <stddef.h> 3986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 4086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#include "common/memory_range.h" 4186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 4286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.orgnamespace google_breakpad { 4386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 4486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// A class encapsulating an ELF core dump file mapped into memory, which 4586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org// provides methods for accessing program headers and the note section. 4686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.orgclass ElfCoreDump { 4786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org public: 4886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // ELF types based on the value of __WORDSIZE. 4986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org typedef ElfW(Ehdr) Ehdr; 5086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org typedef ElfW(Nhdr) Nhdr; 5186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org typedef ElfW(Phdr) Phdr; 5286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org typedef ElfW(Word) Word; 5386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org typedef ElfW(Addr) Addr; 5486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#if __WORDSIZE == 32 5586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org static const int kClass = ELFCLASS32; 5686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#elif __WORDSIZE == 64 5786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org static const int kClass = ELFCLASS64; 5886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#else 5986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#error "Unsupported __WORDSIZE for ElfCoreDump." 6086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#endif 6186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 6286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // A class encapsulating the note content in a core dump, which provides 6386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // methods for accessing the name and description of a note. 6486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org class Note { 6586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org public: 6686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org Note(); 6786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 6886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // Constructor that takes the note content from |content|. 6986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org explicit Note(const MemoryRange& content); 7086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 7186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // Returns true if this note is valid, i,e. a note header is found in 7286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // |content_|, or false otherwise. 7386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org bool IsValid() const; 7486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 7586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // Returns the note header, or NULL if no note header is found in 7686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // |content_|. 7786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org const Nhdr* GetHeader() const; 7886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 7986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // Returns the note type, or 0 if no note header is found in |content_|. 8086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org Word GetType() const; 8186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 8286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // Returns a memory range covering the note name, or an empty range 8386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // if no valid note name is found in |content_|. 8486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org MemoryRange GetName() const; 8586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 8686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // Returns a memory range covering the note description, or an empty 8786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // range if no valid note description is found in |content_|. 8886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org MemoryRange GetDescription() const; 8986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 9086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // Returns the note following this note, or an empty note if no valid 9186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // note is found after this note. 9286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org Note GetNextNote() const; 9386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 9486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org private: 9586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // Returns the size in bytes round up to the word alignment, specified 9686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // for the note section, of a given size in bytes. 9786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org static size_t AlignedSize(size_t size); 9886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 9986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // Note content. 10086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org MemoryRange content_; 10186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org }; 10286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 10386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org ElfCoreDump(); 10486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 10586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // Constructor that takes the core dump content from |content|. 10686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org explicit ElfCoreDump(const MemoryRange& content); 10786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 10886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // Sets the core dump content to |content|. 10986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org void SetContent(const MemoryRange& content); 11086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 11186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // Returns true if a valid ELF header in the core dump, or false otherwise. 11286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org bool IsValid() const; 11386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 11486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // Returns the ELF header in the core dump, or NULL if no ELF header 11586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // is found in |content_|. 11686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org const Ehdr* GetHeader() const; 11786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 11886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // Returns the |index|-th program header in the core dump, or NULL if no 11986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // ELF header is found in |content_| or |index| is out of bounds. 12086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org const Phdr* GetProgramHeader(unsigned index) const; 12186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 12286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // Returns the first program header of |type| in the core dump, or NULL if 12386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // no ELF header is found in |content_| or no program header of |type| is 12486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // found. 12586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org const Phdr* GetFirstProgramHeaderOfType(Word type) const; 12686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 12786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // Returns the number of program headers in the core dump, or 0 if no 12886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // ELF header is found in |content_|. 12986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org unsigned GetProgramHeaderCount() const; 13086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 13186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // Copies |length| bytes of data starting at |virtual_address| in the core 13286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // dump to |buffer|. |buffer| should be a valid pointer to a buffer of at 13386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // least |length| bytes. Returns true if the data to be copied is found in 13486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // the core dump, or false otherwise. 13586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org bool CopyData(void* buffer, Addr virtual_address, size_t length); 13686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 13786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // Returns the first note found in the note section of the core dump, or 13886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // an empty note if no note is found. 13986cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org Note GetFirstNote() const; 14086cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 14186cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org private: 14286cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org // Core dump content. 14386cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org MemoryRange content_; 14486cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org}; 14586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 14686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org} // namespace google_breakpad 14786cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org 14886cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org#endif // COMMON_LINUX_ELF_CORE_DUMP_H_ 149