将值添加到结构数组会导致Seg Fault

时间:2018-05-13 18:38:09

标签: c pointers data-structures segmentation-fault elf

所以我有一个程序,我在其中创建一个结构数组,然后我遍历每个结构并在每个结构中插入值。唯一的问题是,当我尝试插入这些值时,我遇到了分段错误。原谅我,我是新手C程序员,但我环顾四周,无法找到问题的答案。

这是代码(为简单起见重构):

#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 :(得分:2)

你的malloc Section_t表,没关系,

register ... asm("$t9");

但是这个结构包含下一个指针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;

答案 1 :(得分:1)

该行

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节可以有多个标头或零标头,否则最好使{ {1}}成员的类型为header,而不是Elf_Big_Shdr_t