Blame tests/fillfile.c

Packit Service 97d2fb
/* Test program for changing data in one section (but not others) with gaps.
Packit Service 97d2fb
   Copyright (C) 2017 Red Hat, Inc.
Packit Service 97d2fb
   This file is part of elfutils.
Packit Service 97d2fb
Packit Service 97d2fb
   This file is free software; you can redistribute it and/or modify
Packit Service 97d2fb
   it under the terms of the GNU General Public License as published by
Packit Service 97d2fb
   the Free Software Foundation; either version 3 of the License, or
Packit Service 97d2fb
   (at your option) any later version.
Packit Service 97d2fb
Packit Service 97d2fb
   elfutils is distributed in the hope that it will be useful, but
Packit Service 97d2fb
   WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 97d2fb
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 97d2fb
   GNU General Public License for more details.
Packit Service 97d2fb
Packit Service 97d2fb
   You should have received a copy of the GNU General Public License
Packit Service 97d2fb
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
#ifdef HAVE_CONFIG_H
Packit Service 97d2fb
# include <config.h>
Packit Service 97d2fb
#endif
Packit Service 97d2fb
Packit Service 97d2fb
#include <errno.h>
Packit Service 97d2fb
#include <fcntl.h>
Packit Service 97d2fb
#include <inttypes.h>
Packit Service 97d2fb
#include <stdio.h>
Packit Service 97d2fb
#include <stdlib.h>
Packit Service 97d2fb
#include <string.h>
Packit Service 97d2fb
#include <unistd.h>
Packit Service 97d2fb
Packit Service 97d2fb
#include ELFUTILS_HEADER(elf)
Packit Service 97d2fb
#include <gelf.h>
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* Index of last string added.  Returned by add_string ().  */
Packit Service 97d2fb
static size_t stridx = 0;
Packit Service 97d2fb
Packit Service 97d2fb
/* Adds a string and returns the offset in the section.  */
Packit Service 97d2fb
static size_t
Packit Service 97d2fb
add_strtab_entry (Elf_Scn *strtab, const char *str)
Packit Service 97d2fb
{
Packit Service 97d2fb
  size_t lastidx = stridx;
Packit Service 97d2fb
  size_t size = strlen (str) + 1;
Packit Service 97d2fb
Packit Service 97d2fb
  Elf_Data *data = elf_newdata (strtab);
Packit Service 97d2fb
  if (data == NULL)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("cannot create data SHSTRTAB section: %s\n", elf_errmsg (-1));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  data->d_buf = (char *) str; /* Discards const, but we will not change. */
Packit Service 97d2fb
  data->d_type = ELF_T_BYTE;
Packit Service 97d2fb
  data->d_size = size;
Packit Service 97d2fb
  data->d_align = 1;
Packit Service 97d2fb
  data->d_version = EV_CURRENT;
Packit Service 97d2fb
Packit Service 97d2fb
  stridx += size;
Packit Service 97d2fb
  printf ("add_string: '%s', stridx: %zd, lastidx: %zd\n",
Packit Service 97d2fb
	  str, stridx, lastidx);
Packit Service 97d2fb
  return lastidx;
Packit Service 97d2fb
}
Packit Service 97d2fb
Packit Service 97d2fb
static Elf_Scn *
Packit Service 97d2fb
create_strtab (Elf *elf)
Packit Service 97d2fb
{
Packit Service 97d2fb
  // Create strtab section.
Packit Service 97d2fb
  Elf_Scn *scn = elf_newscn (elf);
Packit Service 97d2fb
  if (scn == NULL)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("cannot create strings section: %s\n", elf_errmsg (-1));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  // Add an empty string to the table as NUL entry for section zero.
Packit Service 97d2fb
  add_strtab_entry (scn, "");
Packit Service 97d2fb
Packit Service 97d2fb
  GElf_Shdr shdr_mem;
Packit Service 97d2fb
  GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
Packit Service 97d2fb
  if (shdr == NULL)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("cannot get header for new strtab section: %s\n",
Packit Service 97d2fb
	      elf_errmsg (-1));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  shdr->sh_type = SHT_STRTAB;
Packit Service 97d2fb
  shdr->sh_flags = 0;
Packit Service 97d2fb
  shdr->sh_addr = 0;
Packit Service 97d2fb
  shdr->sh_link = SHN_UNDEF;
Packit Service 97d2fb
  shdr->sh_info = SHN_UNDEF;
Packit Service 97d2fb
  shdr->sh_addralign = 1;
Packit Service 97d2fb
  shdr->sh_entsize = 0;
Packit Service 97d2fb
  shdr->sh_name = add_strtab_entry (scn, ".strtab");
Packit Service 97d2fb
Packit Service 97d2fb
  // We have to store the section strtab index in the ELF header.
Packit Service 97d2fb
  // So sections have actual names.
Packit Service 97d2fb
  GElf_Ehdr ehdr_mem;
Packit Service 97d2fb
  GElf_Ehdr *ehdr = gelf_getehdr (elf, &ehdr_mem);
Packit Service 97d2fb
  if (ehdr == NULL)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("cannot get ELF header: %s\n", elf_errmsg (-1));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  int ndx = elf_ndxscn (scn);
Packit Service 97d2fb
  ehdr->e_shstrndx = ndx;
Packit Service 97d2fb
Packit Service 97d2fb
  if (gelf_update_ehdr (elf, ehdr) == 0)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("cannot update ELF header: %s\n", elf_errmsg (-1));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  // Finished strtab section, update the header.
Packit Service 97d2fb
  if (gelf_update_shdr (scn, shdr) == 0)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("cannot update STRTAB section header: %s\n", elf_errmsg (-1));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  return scn;
Packit Service 97d2fb
}
Packit Service 97d2fb
Packit Service 97d2fb
static char sec_data[] = { 1, 2, 3, 4, 5 };
Packit Service 97d2fb
static char new_data[] = { 5, 4, 3, 2, 1 };
Packit Service 97d2fb
Packit Service 97d2fb
static void
Packit Service 97d2fb
add_data_section (Elf *elf, Elf_Scn *strtab, const char *sname)
Packit Service 97d2fb
{
Packit Service 97d2fb
  printf ("Add data section %s\n", sname);
Packit Service 97d2fb
  Elf_Scn *scn = elf_newscn (elf);
Packit Service 97d2fb
  if (scn == NULL)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("cannot create strings section: %s\n", elf_errmsg (-1));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  GElf_Shdr shdr_mem;
Packit Service 97d2fb
  GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
Packit Service 97d2fb
  if (shdr == NULL)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("cannot get header for new %s section: %s\n",
Packit Service 97d2fb
	      sname, elf_errmsg (-1));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  shdr->sh_type = SHT_PROGBITS;
Packit Service 97d2fb
  shdr->sh_flags = 0;
Packit Service 97d2fb
  shdr->sh_addr = 0;
Packit Service 97d2fb
  shdr->sh_link = SHN_UNDEF;
Packit Service 97d2fb
  shdr->sh_info = SHN_UNDEF;
Packit Service 97d2fb
  shdr->sh_addralign = 128;  // Large alignment to force gap between sections.
Packit Service 97d2fb
  shdr->sh_entsize = 1;
Packit Service 97d2fb
  shdr->sh_name = add_strtab_entry (strtab, sname);
Packit Service 97d2fb
Packit Service 97d2fb
  if (gelf_update_shdr (scn, shdr) == 0)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("cannot update %s section header: %s\n", sname, elf_errmsg (-1));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  /* Add some data, but less than alignment. */
Packit Service 97d2fb
  Elf_Data *data = elf_newdata (scn);
Packit Service 97d2fb
  if (data == NULL)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("cannot update %s section header: %s\n", sname, elf_errmsg (-1));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
  data->d_buf = sec_data;
Packit Service 97d2fb
  data->d_size = 5;
Packit Service 97d2fb
}
Packit Service 97d2fb
Packit Service 97d2fb
static void
Packit Service 97d2fb
check_data (const char *sname, Elf_Data *data, char *buf)
Packit Service 97d2fb
{
Packit Service 97d2fb
  printf ("check data %s [", sname);
Packit Service 97d2fb
  for (int i = 0; i < 5; i++)
Packit Service 97d2fb
    printf ("%d%s", buf[i], i < 4 ? "," : "");
Packit Service 97d2fb
  printf ("]\n");
Packit Service 97d2fb
  if (data == NULL || data->d_buf == NULL)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("No data in section %s\n", sname);
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  if (data->d_size != 5 || memcmp (data->d_buf, buf, 5) != 0)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("Wrong data in section %s [", sname);
Packit Service 97d2fb
      for (size_t i = 0; i < data->d_size; i++)
Packit Service 97d2fb
	printf ("%d%s", ((char *)data->d_buf)[i],
Packit Service 97d2fb
		i < data->d_size - 1 ? "," : "");
Packit Service 97d2fb
      printf ("]\n");
Packit Service 97d2fb
      exit(1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
}
Packit Service 97d2fb
Packit Service 97d2fb
static void
Packit Service 97d2fb
check_elf (const char *fname, int class, int use_mmap)
Packit Service 97d2fb
{
Packit Service 97d2fb
  printf ("\nfname: %s\n", fname);
Packit Service 97d2fb
  stridx = 0; // Reset strtab strings index
Packit Service 97d2fb
Packit Service 97d2fb
  int fd = open (fname, O_RDWR | O_CREAT | O_TRUNC, 0666);
Packit Service 97d2fb
  if (fd == -1)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("cannot open `%s': %s\n", fname, strerror (errno));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  Elf *elf = elf_begin (fd, use_mmap ? ELF_C_WRITE_MMAP : ELF_C_WRITE, NULL);
Packit Service 97d2fb
  if (elf == NULL)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("cannot create ELF descriptor: %s\n", elf_errmsg (-1));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  // Create an ELF header.
Packit Service 97d2fb
  if (gelf_newehdr (elf, class) == 0)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("cannot create ELF header: %s\n", elf_errmsg (-1));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  GElf_Ehdr ehdr_mem;
Packit Service 97d2fb
  GElf_Ehdr *ehdr = gelf_getehdr (elf, &ehdr_mem);
Packit Service 97d2fb
  if (ehdr == NULL)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("cannot get ELF header: %s\n", elf_errmsg (-1));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  // Initialize header.
Packit Service 97d2fb
  ehdr->e_ident[EI_DATA] = class == ELFCLASS64 ? ELFDATA2LSB : ELFDATA2MSB;
Packit Service 97d2fb
  ehdr->e_ident[EI_OSABI] = ELFOSABI_GNU;
Packit Service 97d2fb
  ehdr->e_type = ET_NONE;
Packit Service 97d2fb
  ehdr->e_machine = EM_X86_64;
Packit Service 97d2fb
  ehdr->e_version = EV_CURRENT;
Packit Service 97d2fb
Packit Service 97d2fb
  if (gelf_update_ehdr (elf, ehdr) == 0)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("cannot update ELF header: %s\n", elf_errmsg (-1));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  Elf_Scn *strtab = create_strtab (elf);
Packit Service 97d2fb
  add_data_section (elf, strtab, ".data1");
Packit Service 97d2fb
  add_data_section (elf, strtab, ".data2");
Packit Service 97d2fb
  add_data_section (elf, strtab, ".data3");
Packit Service 97d2fb
  add_data_section (elf, strtab, ".data4");
Packit Service 97d2fb
Packit Service 97d2fb
  // Write everything to disk.
Packit Service 97d2fb
  if (elf_update (elf, ELF_C_WRITE) < 0)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("failure in elf_update(WRITE): %s\n", elf_errmsg (-1));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  if (elf_end (elf) != 0)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("failure in elf_end: %s\n", elf_errmsg (-1));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  close (fd);
Packit Service 97d2fb
Packit Service 97d2fb
  /* Reread the ELF from disk now.  */
Packit Service 97d2fb
  printf ("Rereading %s\n", fname);
Packit Service 97d2fb
  fd = open (fname, O_RDWR, 0666);
Packit Service 97d2fb
  if (fd == -1)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("cannot (re)open `%s': %s\n", fname, strerror (errno));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  elf = elf_begin (fd, use_mmap ? ELF_C_RDWR_MMAP : ELF_C_RDWR, NULL);
Packit Service 97d2fb
  if (elf == NULL)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("cannot create ELF descriptor read-only: %s\n", elf_errmsg (-1));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  /* We are going to change some data (in-place), but want the layout
Packit Service 97d2fb
     to stay exactly the same. */
Packit Service 97d2fb
  elf_flagelf (elf, ELF_C_SET, ELF_F_LAYOUT);
Packit Service 97d2fb
Packit Service 97d2fb
  size_t shdrstrndx;
Packit Service 97d2fb
  if (elf_getshdrstrndx (elf, &shdrstrndx) != 0)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("cannot get shdr str ndx\n");
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
  printf ("shdrstrndx: %zd\n", shdrstrndx);
Packit Service 97d2fb
Packit Service 97d2fb
  // Get third data section and change it.
Packit Service 97d2fb
  Elf_Scn *checkscn = NULL;
Packit Service 97d2fb
  Elf_Scn *scn = elf_nextscn (elf, NULL);
Packit Service 97d2fb
  while (scn != NULL)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      GElf_Shdr shdr_mem;
Packit Service 97d2fb
      GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
Packit Service 97d2fb
      if (shdr == NULL)
Packit Service 97d2fb
	{
Packit Service 97d2fb
	  printf ("cannot get header for section: %s\n", elf_errmsg (-1));
Packit Service 97d2fb
	  exit (1);
Packit Service 97d2fb
	}
Packit Service 97d2fb
      const char *sname = elf_strptr (elf, shdrstrndx, shdr->sh_name);
Packit Service 97d2fb
      if (sname != NULL && strcmp (".data3", sname) == 0)
Packit Service 97d2fb
	checkscn = scn;
Packit Service 97d2fb
Packit Service 97d2fb
      // Get all data, but don't really use it
Packit Service 97d2fb
      // (this triggered the original bug).
Packit Service 97d2fb
      Elf_Data *data = elf_getdata (scn, NULL);
Packit Service 97d2fb
      if (data != NULL && data->d_buf != NULL && data->d_size == 0)
Packit Service 97d2fb
	{
Packit Service 97d2fb
	  printf ("Bad data...n");
Packit Service 97d2fb
	  exit (1);
Packit Service 97d2fb
	}
Packit Service 97d2fb
      scn = elf_nextscn (elf, scn);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  if (checkscn == NULL)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("ELF file doesn't have a .data3 section\n");
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  Elf_Data *data = elf_getdata (checkscn, NULL);
Packit Service 97d2fb
  check_data (".data3", data, sec_data);
Packit Service 97d2fb
  memcpy (data->d_buf, new_data, 5);
Packit Service 97d2fb
  elf_flagdata (data, ELF_C_SET, ELF_F_DIRTY);
Packit Service 97d2fb
Packit Service 97d2fb
  // Write everything to disk.
Packit Service 97d2fb
  if (elf_update (elf, ELF_C_WRITE) < 0)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("failure in elf_update(WRITE): %s\n", elf_errmsg (-1));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  if (elf_end (elf) != 0)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("failure in elf_end: %s\n", elf_errmsg (-1));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  close (fd);
Packit Service 97d2fb
Packit Service 97d2fb
  // And read it in one last time.
Packit Service 97d2fb
  printf ("Rereading %s again\n", fname);
Packit Service 97d2fb
  fd = open (fname, O_RDONLY, 0666);
Packit Service 97d2fb
  if (fd == -1)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("cannot open `%s' read-only: %s\n", fname, strerror (errno));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  elf = elf_begin (fd, use_mmap ? ELF_C_READ_MMAP : ELF_C_READ, NULL);
Packit Service 97d2fb
  if (elf == NULL)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("cannot create ELF descriptor read-only: %s\n", elf_errmsg (-1));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  // Get all .data sections and check them.
Packit Service 97d2fb
  Elf_Scn *scn1 = NULL;
Packit Service 97d2fb
  Elf_Scn *scn2 = NULL;
Packit Service 97d2fb
  Elf_Scn *scn3 = NULL;
Packit Service 97d2fb
  Elf_Scn *scn4 = NULL;
Packit Service 97d2fb
  scn = elf_nextscn (elf, NULL);
Packit Service 97d2fb
  while (scn != NULL)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      GElf_Shdr shdr_mem;
Packit Service 97d2fb
      GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
Packit Service 97d2fb
      if (shdr == NULL)
Packit Service 97d2fb
	{
Packit Service 97d2fb
	  printf ("cannot get header for section: %s\n", elf_errmsg (-1));
Packit Service 97d2fb
	  exit (1);
Packit Service 97d2fb
	}
Packit Service 97d2fb
      const char *sname = elf_strptr (elf, shdrstrndx, shdr->sh_name);
Packit Service 97d2fb
      if (sname != NULL && strcmp (".data1", sname) == 0)
Packit Service 97d2fb
	scn1 = scn;
Packit Service 97d2fb
      else if (sname != NULL && strcmp (".data2", sname) == 0)
Packit Service 97d2fb
	scn2 = scn;
Packit Service 97d2fb
      else if (sname != NULL && strcmp (".data3", sname) == 0)
Packit Service 97d2fb
	scn3 = scn;
Packit Service 97d2fb
      else if (sname != NULL && strcmp (".data4", sname) == 0)
Packit Service 97d2fb
	scn4 = scn;
Packit Service 97d2fb
      scn = elf_nextscn (elf, scn);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  if (scn1 == NULL)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("ELF file doesn't have a .data1 section\n");
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
  data = elf_getdata (scn1, NULL);
Packit Service 97d2fb
  check_data (".data1", data, sec_data);
Packit Service 97d2fb
Packit Service 97d2fb
  if (scn2 == NULL)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("ELF file doesn't have a .data2 section\n");
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
  data = elf_getdata (scn2, NULL);
Packit Service 97d2fb
  check_data (".data2", data, sec_data);
Packit Service 97d2fb
Packit Service 97d2fb
  if (scn3 == NULL)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("ELF file doesn't have a .data3 section\n");
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
  data = elf_getdata (scn3, NULL);
Packit Service 97d2fb
  check_data (".data3", data, new_data);
Packit Service 97d2fb
Packit Service 97d2fb
  if (scn4 == NULL)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("ELF file doesn't have a .data4 section\n");
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
  data = elf_getdata (scn4, NULL);
Packit Service 97d2fb
  check_data (".data4", data, sec_data);
Packit Service 97d2fb
Packit Service 97d2fb
  if (elf_end (elf) != 0)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      printf ("failure in elf_end: %s\n", elf_errmsg (-1));
Packit Service 97d2fb
      exit (1);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  close (fd);
Packit Service 97d2fb
Packit Service 97d2fb
  unlink (fname);
Packit Service 97d2fb
}
Packit Service 97d2fb
Packit Service 97d2fb
int
Packit Service 97d2fb
main (int argc __attribute__ ((unused)),
Packit Service 97d2fb
      char *argv[] __attribute__ ((unused)))
Packit Service 97d2fb
{
Packit Service 97d2fb
  elf_version (EV_CURRENT);
Packit Service 97d2fb
Packit Service 97d2fb
  elf_fill (0xA);
Packit Service 97d2fb
Packit Service 97d2fb
  check_elf ("fill.elf.32", ELFCLASS32, 0);
Packit Service 97d2fb
  check_elf ("fill.elf.32.mmap", ELFCLASS32, 1);
Packit Service 97d2fb
  check_elf ("fill.elf.64", ELFCLASS64, 0);
Packit Service 97d2fb
  check_elf ("fill.elf.64.mmap", ELFCLASS64, 1);
Packit Service 97d2fb
Packit Service 97d2fb
  return 0;
Packit Service 97d2fb
}