Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(2132)

Unified Diff: src/common/pecoff/pecoffutils.h

Issue 1144002: Add dump_syms for DWARF symbols in a PECOFF image, as used by cygwin and mingw Base URL: http://google-breakpad.googlecode.com/svn/trunk/
Patch Set: Add dump_syms for DWARF symbols in a PECOFF image, as used by cygwin and mingw Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/common/pecoff/pecoffutils.cc ('k') | src/tools/windows/dump_syms_dwarf/dump_syms.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/common/pecoff/pecoffutils.h
===================================================================
--- src/common/pecoff/pecoffutils.h (revision 0)
+++ src/common/pecoff/pecoffutils.h (working copy)
@@ -0,0 +1,167 @@
+// Copyright (c) 2014 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// pecoffutils.h: Utilities for dealing with PECOFF files
+//
+
+#ifndef COMMON_PECOFF_PECOFFUTILS_H__
+#define COMMON_PECOFF_PECOFFUTILS_H__
+
+#include "common/pecoff/pecoff.h"
+#include "common/pecoff/pecoff_file_id.h"
+#include "common/module.h"
+
+namespace google_breakpad {
+
+bool IsValidPeCoff(const uint8_t* obj_file);
+int PeCoffClass(const uint8_t* obj_file);
+
+class PeCoffClass32Traits {
+ public:
+ typedef uint32_t Addr;
+ typedef Pe32OptionalHeader PeOptionalHeader;
+ static const int kClass = PE32;
+ static const size_t kAddrSize = 4;
+};
+
+class PeCoffClass64Traits {
+ public:
+ typedef uint64_t Addr;
+ typedef Pe32PlusOptionalHeader PeOptionalHeader;
+ static const int kClass = PE32PLUS;
+ static const size_t kAddrSize = 8;
+};
+// Offset isn't part of the traits as although PE32+ uses 64-bit address space,
+// it still uses 32-bit RVAs and offsets
+
+template <typename PeCoffClassTraits>
+class PeCoffObjectFileReader {
+ public:
+ typedef const uint8_t* ObjectFileBase;
+ typedef const uint8_t* Section;
+ typedef uint32_t Offset;
+ typedef typename PeCoffClassTraits::Addr Addr;
+ static const int kClass = PeCoffClassTraits::kClass;
+ static const size_t kAddrSize = PeCoffClassTraits::kAddrSize;
+
+ static bool IsValid(ObjectFileBase obj_file) {
+ return IsValidPeCoff(obj_file);
+ };
+
+ //
+ // Header information
+ //
+
+ // Return the breakpad symbol file identifier for the architecture
+ static const char* Architecture(ObjectFileBase obj_base);
+
+ // Get the endianness. If it's invalid, return false.
+ static bool Endianness(ObjectFileBase obj_base, bool* big_endian);
+
+ // Find the preferred loading address of the binary.
+ static Addr GetLoadingAddress(ObjectFileBase obj_base);
+
+ //
+ // Section enumeration and location
+ //
+
+ static int GetNumberOfSections(ObjectFileBase obj_base);
+ static const Section FindSectionByIndex(ObjectFileBase obj_base, int i);
+ // Attempt to find a section named |section_name|
+ static const Section FindSectionByName(const char* section_name,
+ ObjectFileBase obj_base);
+
+ //
+ // Section information
+ //
+
+ // Convert a section into a pointer to the mapped address in the current
+ // process.
+ static const uint8_t* GetSectionPointer(ObjectFileBase obj_base,
+ Section section);
+
+ // Get the size of a section
+ static Offset GetSectionSize(ObjectFileBase obj_base, Section section);
+
+ // Get relative virtual address (RVA) of a section
+ static Offset GetSectionRVA(ObjectFileBase obj_base, Section section);
+
+ // Get name of a section
+ static const char* GetSectionName(ObjectFileBase obj_base,Section section);
+
+ // Find any linked section
+ static const Section FindLinkedSection(ObjectFileBase obj_base,
+ Section section) {
+ return 0; // PECOFF doesn't have the concept of linked sections
+ }
+
+ //
+ //
+ //
+
+ // Load symbols from the object file's exported symbol table
+ static bool ExportedSymbolsToModule(ObjectFileBase obj_base, Module* module);
+
+ // Return the identifier for the file mapped into memory.
+ // Return an empty string if the identifier could not be created
+ // for the file.
+ static string FileIdentifierFromMappedFile(ObjectFileBase obj_base);
+
+ //
+ // Helpers for PeCoffFileID
+ //
+
+ // Get the build-id
+ static bool GetBuildID(ObjectFileBase obj_base,
+ uint8_t identifier[kMDGUIDSize], uint32_t* age);
+ // Hash the text section
+ static bool HashTextSection(ObjectFileBase obj_base,
+ uint8_t identifier[kMDGUIDSize]);
+
+ private:
+ typedef typename PeCoffClassTraits::PeOptionalHeader PeOptionalHeader;
+
+ //
+ // Private implementation helper functions
+ //
+ static const PeHeader* GetHeader(ObjectFileBase obj_base);
+ static const PeOptionalHeader* GetOptionalHeader(ObjectFileBase obj_base);
+ static const PeSectionHeader* GetSectionTable(ObjectFileBase obj_base);
+ static const char* GetStringTable(ObjectFileBase obj_base);
+ static const PeDataDirectory* GetDataDirectoryEntry(ObjectFileBase obj_base,
+ unsigned int entry);
+ static const uint8_t* ConvertRVAToPointer(ObjectFileBase obj_base, Offset rva);
+};
+
+class PeCoffClass32 : public PeCoffObjectFileReader<PeCoffClass32Traits> { };
+class PeCoffClass64 : public PeCoffObjectFileReader<PeCoffClass64Traits> { };
+
+} // namespace google_breakpad
+
+#endif // COMMON_PECOFF_PECOFFUTILS_H__
« no previous file with comments | « src/common/pecoff/pecoffutils.cc ('k') | src/tools/windows/dump_syms_dwarf/dump_syms.cc » ('j') | no next file with comments »

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld 1004:630ec63f810e-tainted