OLD | NEW |
1 // Copyright (c) 2012, Google Inc. | 1 // Copyright (c) 2012, Google Inc. |
2 // All rights reserved. | 2 // All rights reserved. |
3 // | 3 // |
4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
6 // met: | 6 // met: |
7 // | 7 // |
8 // * Redistributions of source code must retain the above copyright | 8 // * Redistributions of source code must retain the above copyright |
9 // notice, this list of conditions and the following disclaimer. | 9 // notice, this list of conditions and the following disclaimer. |
10 // * Redistributions in binary form must reproduce the above | 10 // * Redistributions in binary form must reproduce the above |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 // Traits classes so consumers can write templatized code to deal | 42 // Traits classes so consumers can write templatized code to deal |
43 // with specific ELF bits. | 43 // with specific ELF bits. |
44 struct ElfClass32 { | 44 struct ElfClass32 { |
45 typedef Elf32_Addr Addr; | 45 typedef Elf32_Addr Addr; |
46 typedef Elf32_Ehdr Ehdr; | 46 typedef Elf32_Ehdr Ehdr; |
47 typedef Elf32_Nhdr Nhdr; | 47 typedef Elf32_Nhdr Nhdr; |
48 typedef Elf32_Phdr Phdr; | 48 typedef Elf32_Phdr Phdr; |
49 typedef Elf32_Shdr Shdr; | 49 typedef Elf32_Shdr Shdr; |
50 typedef Elf32_Half Half; | 50 typedef Elf32_Half Half; |
51 typedef Elf32_Off Off; | 51 typedef Elf32_Off Off; |
| 52 typedef Elf32_Sym Sym; |
52 typedef Elf32_Word Word; | 53 typedef Elf32_Word Word; |
| 54 |
53 static const int kClass = ELFCLASS32; | 55 static const int kClass = ELFCLASS32; |
| 56 static const uint16_t kMachine = EM_386; |
54 static const size_t kAddrSize = sizeof(Elf32_Addr); | 57 static const size_t kAddrSize = sizeof(Elf32_Addr); |
| 58 static constexpr const char* kMachineName = "x86"; |
55 }; | 59 }; |
56 | 60 |
57 struct ElfClass64 { | 61 struct ElfClass64 { |
58 typedef Elf64_Addr Addr; | 62 typedef Elf64_Addr Addr; |
59 typedef Elf64_Ehdr Ehdr; | 63 typedef Elf64_Ehdr Ehdr; |
60 typedef Elf64_Nhdr Nhdr; | 64 typedef Elf64_Nhdr Nhdr; |
61 typedef Elf64_Phdr Phdr; | 65 typedef Elf64_Phdr Phdr; |
62 typedef Elf64_Shdr Shdr; | 66 typedef Elf64_Shdr Shdr; |
63 typedef Elf64_Half Half; | 67 typedef Elf64_Half Half; |
64 typedef Elf64_Off Off; | 68 typedef Elf64_Off Off; |
| 69 typedef Elf64_Sym Sym; |
65 typedef Elf64_Word Word; | 70 typedef Elf64_Word Word; |
| 71 |
66 static const int kClass = ELFCLASS64; | 72 static const int kClass = ELFCLASS64; |
| 73 static const uint16_t kMachine = EM_X86_64; |
67 static const size_t kAddrSize = sizeof(Elf64_Addr); | 74 static const size_t kAddrSize = sizeof(Elf64_Addr); |
| 75 static constexpr const char* kMachineName = "x86_64"; |
68 }; | 76 }; |
69 | 77 |
70 bool IsValidElf(const void* elf_header); | 78 bool IsValidElf(const void* elf_header); |
71 int ElfClass(const void* elf_base); | 79 int ElfClass(const void* elf_base); |
72 | 80 |
73 // Attempt to find a section named |section_name| of type |section_type| | 81 // Attempt to find a section named |section_name| of type |section_type| |
74 // in the ELF binary data at |elf_mapped_base|. On success, returns true | 82 // in the ELF binary data at |elf_mapped_base|. On success, returns true |
75 // and sets |*section_start| to point to the start of the section data, | 83 // and sets |*section_start| to point to the start of the section data, |
76 // and |*section_size| to the size of the section's data. If |elfclass| | 84 // and |*section_size| to the size of the section's data. If |elfclass| |
77 // is not NULL, set |*elfclass| to the ELF file class. | 85 // is not NULL, set |*elfclass| to the ELF file class. |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 // to specify the return type to avoid having to dynamic_cast the | 117 // to specify the return type to avoid having to dynamic_cast the |
110 // result. | 118 // result. |
111 template<typename ElfClass, typename T> | 119 template<typename ElfClass, typename T> |
112 const T* | 120 const T* |
113 GetOffset(const typename ElfClass::Ehdr* elf_header, | 121 GetOffset(const typename ElfClass::Ehdr* elf_header, |
114 typename ElfClass::Off offset); | 122 typename ElfClass::Off offset); |
115 | 123 |
116 } // namespace google_breakpad | 124 } // namespace google_breakpad |
117 | 125 |
118 #endif // COMMON_LINUX_ELFUTILS_H_ | 126 #endif // COMMON_LINUX_ELFUTILS_H_ |
OLD | NEW |