diff options
Diffstat (limited to 'src/common/linux/file_id.cc')
-rw-r--r-- | src/common/linux/file_id.cc | 105 |
1 files changed, 1 insertions, 104 deletions
diff --git a/src/common/linux/file_id.cc b/src/common/linux/file_id.cc index ff2f29e2..4e380b06 100644 --- a/src/common/linux/file_id.cc +++ b/src/common/linux/file_id.cc @@ -36,17 +36,11 @@ #include <arpa/inet.h> #include <assert.h> -#if defined(__ANDROID__) -#include <linux/elf.h> -#include "client/linux/android_link.h" -#else -#include <elf.h> -#include <link.h> -#endif #include <string.h> #include <algorithm> +#include "common/linux/elfutils.h" #include "common/linux/linux_libc_support.h" #include "common/linux/memory_mapped_file.h" #include "third_party/lss/linux_syscall_support.h" @@ -61,105 +55,8 @@ FileID::FileID(const char* path) { strncpy(path_, path, sizeof(path_)); } -struct ElfClass32 { - typedef Elf32_Ehdr Ehdr; - typedef Elf32_Nhdr Nhdr; - typedef Elf32_Shdr Shdr; - static const int kClass = ELFCLASS32; -}; - -struct ElfClass64 { - typedef Elf64_Ehdr Ehdr; - typedef Elf64_Nhdr Nhdr; - typedef Elf64_Shdr Shdr; - static const int kClass = ELFCLASS64; -}; - // These six functions are also used inside the crashed process, so be safe // and use the syscall/libc wrappers instead of direct syscalls or libc. -template<typename ElfClass> -static void FindElfClassSection(const char *elf_base, - const char *section_name, - uint32_t section_type, - const void **section_start, - int *section_size) { - typedef typename ElfClass::Ehdr Ehdr; - typedef typename ElfClass::Shdr Shdr; - - assert(elf_base); - assert(section_start); - assert(section_size); - - assert(my_strncmp(elf_base, ELFMAG, SELFMAG) == 0); - - int name_len = my_strlen(section_name); - - const Ehdr* elf_header = reinterpret_cast<const Ehdr*>(elf_base); - assert(elf_header->e_ident[EI_CLASS] == ElfClass::kClass); - - const Shdr* sections = - reinterpret_cast<const Shdr*>(elf_base + elf_header->e_shoff); - const Shdr* string_section = sections + elf_header->e_shstrndx; - - const Shdr* section = NULL; - for (int i = 0; i < elf_header->e_shnum; ++i) { - if (sections[i].sh_type == section_type) { - const char* current_section_name = (char*)(elf_base + - string_section->sh_offset + - sections[i].sh_name); - if (!my_strncmp(current_section_name, section_name, name_len)) { - section = §ions[i]; - break; - } - } - } - if (section != NULL && section->sh_size > 0) { - *section_start = elf_base + section->sh_offset; - *section_size = section->sh_size; - } -} - -// Attempt to find a section named |section_name| of type |section_type| -// in the ELF binary data at |elf_mapped_base|. On success, returns true -// and sets |*section_start| to point to the start of the section data, -// and |*section_size| to the size of the section's data. If |elfclass| -// is not NULL, set |*elfclass| to the ELF file class. -static bool FindElfSection(const void *elf_mapped_base, - const char *section_name, - uint32_t section_type, - const void **section_start, - int *section_size, - int *elfclass) { - assert(elf_mapped_base); - assert(section_start); - assert(section_size); - - *section_start = NULL; - *section_size = 0; - - const char* elf_base = - static_cast<const char*>(elf_mapped_base); - const ElfW(Ehdr)* elf_header = - reinterpret_cast<const ElfW(Ehdr)*>(elf_base); - if (my_strncmp(elf_base, ELFMAG, SELFMAG) != 0) - return false; - - if (elfclass) { - *elfclass = elf_header->e_ident[EI_CLASS]; - } - - if (elf_header->e_ident[EI_CLASS] == ELFCLASS32) { - FindElfClassSection<ElfClass32>(elf_base, section_name, section_type, - section_start, section_size); - return *section_start != NULL; - } else if (elf_header->e_ident[EI_CLASS] == ELFCLASS64) { - FindElfClassSection<ElfClass64>(elf_base, section_name, section_type, - section_start, section_size); - return *section_start != NULL; - } - - return false; -} template<typename ElfClass> static bool ElfClassBuildIDNoteIdentifier(const void *section, |