Добавление значений в массив структур приводит к Seg Fault - PullRequest
0 голосов
/ 13 мая 2018

Итак, у меня есть программа, в которой я создаю массив структур, а затем просматриваю каждую структуру и вставляю значения в каждую. Единственная проблема, когда я пытаюсь вставить эти значения, я сталкиваюсь с ошибкой сегментации. Простите, я начинающий программист на Си, но я огляделся и не смог найти ответ на свою проблему.

Вот код (переработан для простоты):

#include "readelf.h"


int main(int ac, char **av)
{
    int elf_shnum, sh_name_index, i;
    Section_t *sections;

    i = 0;
    elf_shnum = 12;
    sh_name_index = 24;

    sections = malloc(elf_shnum * sizeof(Section_t));

    sections[i].header->sh_name = sh_name_index;

    return (0);
}

включаемый файл:

#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdint.h>
#include <elf.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

typedef struct
{
  uint64_t  sh_name;                /* Section name (string tbl index) */
  uint64_t  sh_type;                /* Section type */
  uint64_t  sh_flags;               /* Section flags */
  uint64_t  sh_addr;                /* Section virtual addr at execution */
  uint64_t  sh_offset;              /* Section file offset */
  uint64_t  sh_size;                /* Section size in bytes */
  uint64_t  sh_link;                /* Link to another section */
  uint64_t  sh_info;                /* Additional section information */
  uint64_t  sh_addralign;           /* Section alignment */
  uint64_t  sh_entsize;             /* Entry size if section holds table */
} Elf_Big_Shdr_t;

typedef union
{
    Elf32_Shdr Elf32;
    Elf64_Shdr Elf64;
} Elf_Shdr_t;

typedef struct
{
    Elf_Big_Shdr_t *header;
    unsigned char *data;
} Section_t;

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Строка

sections = malloc(elf_shnum * sizeof(Section_t));

выделяет группу данных и сохраняет их в sections.Фактические данные в выделенной памяти являются неопределенными.Затем в следующей строке

sections[i].header->sh_name = sh_name_index;

вы пытаетесь обработать часть этой памяти (sections[0].header) как указатель и разыменовать ее.Однако, поскольку значение не определено, это неопределенное поведение.Наиболее вероятным и наименее проблемным результатом является ошибка по умолчанию.

Вместо этого вам необходимо присвоить полезные значения каждому Section_t перед его использованием.Вы можете сделать это, malloc выделив достаточно места для заголовка Elf и присвоив результат sections[i].header, но если разделы Elf не могут иметь несколько заголовков или нулевые заголовки, возможно, было бы лучше сделать так, чтобы элемент header имелвведите Elf_Big_Shdr_t вместо Elf_Big_Shdr_t *.

0 голосов
/ 13 мая 2018

Вы используете malloc для таблицы Section_t, и все в порядке,

sections = malloc(elf_shnum * sizeof(Section_t));

но эта структура состоит из следующего указателя Header

typedef struct
{
    Elf_Big_Shdr_t *header;
    unsigned char *data;
} Section_t;

Прежде чем использовать его, вам следует выделить для него память.

например:

sections[i].header = malloc(sizeof(Elf_Big_Shdr_t));
sections[i].header->sh_name = sh_name_index;

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

typedef struct
{
    Elf_Big_Shdr_t header;
    unsigned char *data;
} Section_t;
...