diff options
author | mark@chromium.org <mark@chromium.org@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2010-08-27 18:52:09 +0000 |
---|---|---|
committer | mark@chromium.org <mark@chromium.org@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2010-08-27 18:52:09 +0000 |
commit | 3a7466663c7b8ddc550a96666c2a14c82d91536f (patch) | |
tree | cc6c980dec48d4a80561d28f8353d077d054e6ba /src/common/linux/file_id_unittest.cc | |
parent | Use <inttypes.h> macros for formatting fixed-width types. (diff) | |
download | breakpad-3a7466663c7b8ddc550a96666c2a14c82d91536f.tar.xz |
Linux FileID should work with ELFCLASS32 and ELFCLASS64 regardless of what's
native.
BUG=399
TEST=none
Review URL: http://breakpad.appspot.com/178001
git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@677 4c0a9323-5329-0410-9bdc-e9ce6186880e
Diffstat (limited to 'src/common/linux/file_id_unittest.cc')
-rw-r--r-- | src/common/linux/file_id_unittest.cc | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/common/linux/file_id_unittest.cc b/src/common/linux/file_id_unittest.cc index e15d39fb..e28a2f09 100644 --- a/src/common/linux/file_id_unittest.cc +++ b/src/common/linux/file_id_unittest.cc @@ -29,6 +29,7 @@ // Unit tests for FileID +#include <elf.h> #include <stdlib.h> #include "common/linux/file_id.h" @@ -74,3 +75,69 @@ TEST(FileIDTest, FileIDStrip) { EXPECT_STREQ(identifier_string1, identifier_string2); unlink(templ); } + +struct ElfClass32 { + typedef Elf32_Ehdr Ehdr; + typedef Elf32_Shdr Shdr; + static const int kClass = ELFCLASS32; +}; + +struct ElfClass64 { + typedef Elf64_Ehdr Ehdr; + typedef Elf64_Shdr Shdr; + static const int kClass = ELFCLASS64; +}; + +template<typename ElfClass> +struct ElfishElf { + typedef typename ElfClass::Ehdr Ehdr; + typedef typename ElfClass::Shdr Shdr; + + Ehdr elf_header; + Shdr text_header; + Shdr string_header; + char text_section[128]; + char string_section[8]; + + static void Populate(ElfishElf* elf) { + memset(elf, 0, sizeof(ElfishElf)); + memcpy(elf, ELFMAG, SELFMAG); + elf->elf_header.e_ident[EI_CLASS] = ElfClass::kClass; + elf->elf_header.e_shoff = offsetof(ElfishElf, text_header); + elf->elf_header.e_shnum = 2; + elf->elf_header.e_shstrndx = 1; + elf->text_header.sh_name = 0; + elf->text_header.sh_type = SHT_PROGBITS; + elf->text_header.sh_offset = offsetof(ElfishElf, text_section); + elf->text_header.sh_size = sizeof(text_section); + for (size_t i = 0; i < sizeof(text_section); ++i) { + elf->text_section[i] = i * 3; + } + elf->string_header.sh_offset = offsetof(ElfishElf, string_section); + strcpy(elf->string_section, ".text"); + } +}; + +TEST(FileIDTest, ElfClass) { + uint8_t identifier[sizeof(MDGUID)]; + const char expected_identifier_string[] = + "80808080-8080-0000-0000-008080808080"; + char identifier_string[sizeof(expected_identifier_string)]; + + ElfishElf<ElfClass32> elf32; + ElfishElf<ElfClass32>::Populate(&elf32); + EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(&elf32, identifier)); + FileID::ConvertIdentifierToString(identifier, identifier_string, + sizeof(identifier_string)); + EXPECT_STREQ(expected_identifier_string, identifier_string); + + memset(identifier, 0, sizeof(identifier)); + memset(identifier_string, 0, sizeof(identifier_string)); + + ElfishElf<ElfClass64> elf64; + ElfishElf<ElfClass64>::Populate(&elf64); + EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(&elf64, identifier)); + FileID::ConvertIdentifierToString(identifier, identifier_string, + sizeof(identifier_string)); + EXPECT_STREQ(expected_identifier_string, identifier_string); +} |