// Copyright 2006 Google LLC // // 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 LLC 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. // // file_id.cc: Return a unique identifier for a file // // See file_id.h for documentation // #ifdef HAVE_CONFIG_H #include <config.h> // Must come first #endif #include "common/linux/file_id.h" #include <arpa/inet.h> #include <assert.h> #include <string.h> #include <algorithm> #include <string> #include "common/linux/elf_gnu_compat.h" #include "common/linux/elfutils.h" #include "common/linux/linux_libc_support.h" #include "common/linux/memory_mapped_file.h" #include "common/using_std_string.h" #include "third_party/lss/linux_syscall_support.h" namespace google_breakpad { namespace elf { // Used in a few places for backwards-compatibility. const size_t kMDGUIDSize = …; FileID::FileID(const char* path) : … { … } // ELF note name and desc are 32-bits word padded. #define NOTE_PADDING(a) … // These functions are also used inside the crashed process, so be safe // and use the syscall/libc wrappers instead of direct syscalls or libc. static bool ElfClassBuildIDNoteIdentifier(const void* section, size_t length, wasteful_vector<uint8_t>& identifier) { … } // Attempt to locate a .note.gnu.build-id section in an ELF binary // and copy it into |identifier|. static bool FindElfBuildIDNote(const void* elf_mapped_base, wasteful_vector<uint8_t>& identifier) { … } // Attempt to locate the .text section of an ELF binary and generate // a simple hash by XORing the first page worth of bytes into |identifier|. static bool HashElfTextSection(const void* elf_mapped_base, wasteful_vector<uint8_t>& identifier) { … } // static bool FileID::ElfFileIdentifierFromMappedFile(const void* base, wasteful_vector<uint8_t>& identifier) { … } bool FileID::ElfFileIdentifier(wasteful_vector<uint8_t>& identifier) { … } // These three functions are not ever called in an unsafe context, so it's OK // to allocate memory and use libc. static string bytes_to_hex_string(const uint8_t* bytes, size_t count) { … } // static string FileID::ConvertIdentifierToUUIDString( const wasteful_vector<uint8_t>& identifier) { … } // static string FileID::ConvertIdentifierToString( const wasteful_vector<uint8_t>& identifier) { … } } // elf } // namespace google_breakpad