diff options
author | Alex Deymo <deymo@chromium.org> | 2014-08-08 13:16:23 -0700 |
---|---|---|
committer | chrome-internal-fetch <chrome-internal-fetch@google.com> | 2014-08-09 04:43:59 +0000 |
commit | c1711e203f14111a5384860ad1a3ddf07c9d01ed (patch) | |
tree | 56614c87ddfe1523af66e5e2f7c2e32ae5a872d9 /utils.cc | |
parent | 5b2a5e8c87edfff2ac526dc6d87997b5d6ed5d05 (diff) |
update_engine: Use constants from elf.h.
This patch changes GetFileFormatELF() to use the constants from elf.h
and includes the mips architecture.
BUG=chromium:401873
TEST=FEATURES=test emerge-link update_engine
Change-Id: I4d2924f121cd56dc80b8099b46f4456ebb3dfefc
Reviewed-on: https://chromium-review.googlesource.com/211662
Reviewed-by: Alex Deymo <deymo@chromium.org>
Commit-Queue: Alex Deymo <deymo@chromium.org>
Tested-by: Alex Deymo <deymo@chromium.org>
Reviewed-by: Mike Frysinger <vapier@chromium.org>
Diffstat (limited to 'utils.cc')
-rw-r--r-- | utils.cc | 42 |
1 files changed, 24 insertions, 18 deletions
@@ -8,6 +8,7 @@ #include <attr/xattr.h> #include <dirent.h> +#include <elf.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> @@ -696,18 +697,18 @@ string GetPathOnBoard(const string& command) { // description of it on the |output| string. static bool GetFileFormatELF(const char* buffer, size_t size, string* output) { // 0x00: EI_MAG - ELF magic header, 4 bytes. - if (size < 4 || memcmp(buffer, "\x7F""ELF", 4) != 0) + if (size < SELFMAG || memcmp(buffer, ELFMAG, SELFMAG) != 0) return false; *output = "ELF"; // 0x04: EI_CLASS, 1 byte. - if (size < 0x04 + 1) + if (size < EI_CLASS + 1) return true; - switch (buffer[4]) { - case 1: + switch (buffer[EI_CLASS]) { + case ELFCLASS32: *output += " 32-bit"; break; - case 2: + case ELFCLASS64: *output += " 64-bit"; break; default: @@ -715,14 +716,14 @@ static bool GetFileFormatELF(const char* buffer, size_t size, string* output) { } // 0x05: EI_DATA, endianness, 1 byte. - if (size < 0x05 + 1) + if (size < EI_DATA + 1) return true; - char ei_data = buffer[5]; + char ei_data = buffer[EI_DATA]; switch (ei_data) { - case 1: + case ELFDATA2LSB: *output += " little-endian"; break; - case 2: + case ELFDATA2MSB: *output += " big-endian"; break; default: @@ -731,24 +732,29 @@ static bool GetFileFormatELF(const char* buffer, size_t size, string* output) { return true; } - // 0x12: e_machine, 2 byte endianness based on ei_data - if (size < 0x12 + 2) + const Elf32_Ehdr* hdr = reinterpret_cast<const Elf32_Ehdr*>(buffer); + // 0x12: e_machine, 2 byte endianness based on ei_data. The position (0x12) + // and size is the same for both 32 and 64 bits. + if (size < offsetof(Elf32_Ehdr, e_machine) + sizeof(hdr->e_machine)) return true; - uint16_t e_machine = *reinterpret_cast<const uint16_t*>(buffer+0x12); + uint16_t e_machine; // Fix endianess regardless of the host endianess. - if (ei_data == 1) - e_machine = le16toh(e_machine); + if (ei_data == ELFDATA2LSB) + e_machine = le16toh(hdr->e_machine); else - e_machine = be16toh(e_machine); + e_machine = be16toh(hdr->e_machine); switch (e_machine) { - case 0x03: + case EM_386: *output += " x86"; break; - case 0x28: + case EM_MIPS: + *output += " mips"; + break; + case EM_ARM: *output += " arm"; break; - case 0x3E: + case EM_X86_64: *output += " x86-64"; break; default: |