Как прочитать 64 битное значение?

234
12 июня 2018, 07:20

Мне надо поместить информацию об ELF в структуру заголовка, при этом поля труктуры являются 64 битными значениями. Когда я пробую их прочитать обычным способом, то полчаю 0 во всех полях. Подскажите пожалуйста, как я могу заставить код представленный ниже работать правильно?

  1. hexdump файла из которого надо прочитать ELF байты

    00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
    00000010  01 00 3e 00 01 00 00 00  00 00 00 00 00 00 00 00  |..>.............|
    00000020  00 00 00 00 00 00 00 00  40 00 00 00 00 00 00 00  |........@.......|
    00000030  00 00 00 00 40 00 00 00  00 00 40 00 05 00 02 00  |....@.....@.....|
    00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    00000080  01 00 00 00 01 00 00 00  06 00 00 00 00 00 00 00  |................|
    00000090  00 00 00 00 00 00 00 00  80 01 00 00 00 00 00 00  |................|
    000000a0  0c 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    000000b0  10 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    000000c0  07 00 00 00 03 00 00 00  00 00 00 00 00 00 00 00  |................|
    000000d0  00 00 00 00 00 00 00 00  90 01 00 00 00 00 00 00  |................|
    000000e0  21 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |!...............|
    000000f0  01 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    00000100  11 00 00 00 02 00 00 00  00 00 00 00 00 00 00 00  |................|
    00000110  00 00 00 00 00 00 00 00  c0 01 00 00 00 00 00 00  |................|
    00000120  60 00 00 00 00 00 00 00  04 00 00 00 03 00 00 00  |`...............|
    00000130  04 00 00 00 00 00 00 00  18 00 00 00 00 00 00 00  |................|
    00000140  19 00 00 00 03 00 00 00  00 00 00 00 00 00 00 00  |................|
    00000150  00 00 00 00 00 00 00 00  20 02 00 00 00 00 00 00  |........ .......|
    00000160  0e 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    00000170  01 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    00000180  b8 3c 00 00 00 bf 00 00  00 00 0f 05 00 00 00 00  |.<..............|
    00000190  00 2e 74 65 78 74 00 2e  73 68 73 74 72 74 61 62  |..text..shstrtab|
    000001a0  00 2e 73 79 6d 74 61 62  00 2e 73 74 72 74 61 62  |..symtab..strtab|
    000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    000001d0  00 00 00 00 00 00 00 00  01 00 00 00 04 00 f1 ff  |................|
    000001e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    000001f0  00 00 00 00 03 00 01 00  00 00 00 00 00 00 00 00  |................|
    00000200  00 00 00 00 00 00 00 00  07 00 00 00 10 00 01 00  |................|
    00000210  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    00000220  00 65 78 31 2e 73 00 5f  73 74 61 72 74 00 00 00  |.ex1.s._start...|
  2. Исходный код для чтения ELF в структуру

    #include <iostream>
    #include <fstream>
    #include <stdint.h>
    /* Type for a 16-bit quantity.  */
    typedef uint16_t Elf64_Half;
    /* Types for signed and unsigned 32-bit quantities.  */
    typedef uint32_t Elf64_Word;
    /* Type of addresses.  */
    typedef uint64_t Elf64_Addr;
    /* Type of file offsets.  */
    typedef uint64_t Elf64_Off;
    /* The ELF file header.  This appears at the start of every ELF file.  */
    #define EI_NIDENT (16)
    typedef struct
    {
      unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */
      Elf64_Half      e_type;                   /* Object file type */
      Elf64_Half      e_machine;              /* Architecture */
      Elf64_Word      e_version;            /* Object file version */
      Elf64_Addr      e_entry;            /* Entry point virtual address */
      Elf64_Off     e_phoff;              /* Program header table file offset */
      Elf64_Off     e_shoff;              /* Section header table file offset */
      Elf64_Word      e_flags;            /* Processor-specific flags */
      Elf64_Half    e_ehsize;             /* ELF header size in bytes */
      Elf64_Half    e_phentsize;            /* Program header table entry size */
      Elf64_Half    e_phnum;                /* Program header table entry count */
      Elf64_Half      e_shentsize;          /* Section header table entry size */
      Elf64_Half    e_shnum;                /* Section header table entry count */
      Elf64_Half      e_shstrndx;           /* Section header string table index */
    } Elf64_Ehdr;
    int main(int argc, char const *argv[])
    {
        Elf64_Ehdr ehdr = {};
        std::ifstream ifs;
        ifs.open("ex1.o", std::ios::binary|std::ios::in);
        for (int i = 0; i < EI_NIDENT; i++)
        {
          ifs >> ehdr.e_ident[i];
        }
        ifs >> ehdr.e_type;
        ifs >> ehdr.e_machine;
        ifs >> ehdr.e_version;
        ifs >> ehdr.e_entry;
        ifs >> ehdr.e_phoff;
        ifs >> ehdr.e_shoff;
        ifs >> ehdr.e_flags;
        ifs >> ehdr.e_ehsize;
        ifs >> ehdr.e_phentsize;
        ifs >> ehdr.e_phnum;
        ifs >> ehdr.e_shentsize;
        ifs >> ehdr.e_shnum;
        ifs >> ehdr.e_shstrndx;
        return 0;
    }
  3. Результат: Все поля, кроме e_ident содержат 0

Answer 1

Попробуйте вместо всего этого чтения каждого поля по очереди одно чтение

ifs.read((char*)&ehdr,sizeof(ehdr))

благо у вас явный POD (plain old data, простые старые данные в стиле С).

Забавно - те, у кого структуры не POD - пытаются писать-читать куском в память, а те, у кого чистый POD - напротив, начинают ненужное (да и неверное к тому же) чтение полями...

READ ALSO
как сделать эффект grayscale

как сделать эффект grayscale

Можно ли как-то сделать эффект такой же как на этом видео https://wwwyoutube

226
Как сделать выемку в меню под логотип?

Как сделать выемку в меню под логотип?

Как можно сделать прозрачным участок меню вокруг логотипа

242
Обнуляется state без обращения React

Обнуляется state без обращения React

В конструкторе объявляю state:

223
Почему в цикле теряется контекст?

Почему в цикле теряется контекст?

По какой-то причине теряется контекст вызова в этой части кода:

193