Мне надо поместить информацию об ELF в структуру заголовка, при этом поля труктуры являются 64 битными значениями. Когда я пробую их прочитать обычным способом, то полчаю 0 во всех полях. Подскажите пожалуйста, как я могу заставить код представленный ниже работать правильно?
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...|
Исходный код для чтения 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;
}
Результат: Все поля, кроме e_ident содержат 0
Попробуйте вместо всего этого чтения каждого поля по очереди одно чтение
ifs.read((char*)&ehdr,sizeof(ehdr))
благо у вас явный POD (plain old data, простые старые данные в стиле С).
Забавно - те, у кого структуры не POD - пытаются писать-читать куском в память, а те, у кого чистый POD - напротив, начинают ненужное (да и неверное к тому же) чтение полями...
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Можно ли как-то сделать эффект такой же как на этом видео https://wwwyoutube
Как можно сделать прозрачным участок меню вокруг логотипа
По какой-то причине теряется контекст вызова в этой части кода: