Fix to use a single disposable copy of section header table and program
authorFred Fish <fnf@specifix.com>
Sat, 28 Mar 1992 21:10:05 +0000 (21:10 +0000)
committerFred Fish <fnf@specifix.com>
Sat, 28 Mar 1992 21:10:05 +0000 (21:10 +0000)
header table entries.

bfd/ChangeLog
bfd/elf.c

index b30b0a8f4987d79ada65cca7d889f1661e6a6da5..2daf8b979b3a1f2376e8960c402f46410f23698e 100644 (file)
@@ -1,3 +1,9 @@
+Sat Mar 28 13:07:02 1992  Fred Fish  (fnf@cygnus.com)
+
+       * elf.c (elf_object_p, elf_core_file_p):  Fix to use only a single
+       local, disposable, copy of the external form of section header
+       table and program header table entries.
+
 Thu Mar 26 16:59:58 1992  John Gilmore  (gnu at cygnus.com)
 
        * Makefile.in:  Set MINIMIZE back to 0 for a real release.
index 86c5b5f25f1c13de03d9e853c26ebeccf5de5af1..730becdbc2ce3cd8c5c8d99a98ff7ed1559c2fbf 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -223,6 +223,7 @@ DEFUN(bfd_section_from_shdr, (abfd, hdr, shstrtab),
 
   name = hdr -> sh_name ? shstrtab + hdr -> sh_name : "unnamed";
   newsect = bfd_make_section (abfd, name);
+  if (!newsect) return false;
   newsect -> vma = hdr -> sh_addr;
   newsect -> _raw_size = hdr -> sh_size;
   if (!(hdr -> sh_type == SHT_NOBITS))
@@ -551,7 +552,7 @@ DEFUN(elf_corefile_note, (abfd, hdr),
   asection *newsect;
 
   if (hdr -> p_filesz > 0
-      && (buf = (char *)malloc(hdr -> p_filesz)) != NULL
+      && (buf = (char *) bfd_xmalloc (hdr -> p_filesz)) != NULL
       && bfd_seek (abfd, hdr -> p_offset, SEEK_SET) != -1L
       && bfd_read ((PTR) buf, hdr -> p_filesz, 1, abfd) == hdr -> p_filesz)
     {
@@ -648,8 +649,8 @@ DEFUN (elf_object_p, (abfd), bfd *abfd)
 {
   Elf_External_Ehdr x_ehdr;    /* Elf file header, external form */
   Elf_Internal_Ehdr i_ehdr;    /* Elf file header, internal form */
-  Elf_External_Shdr *x_shdr;   /* Section header table, external form */
-  Elf_Internal_Shdr *i_shdr  /* Section header table, internal form */
+  Elf_External_Shdr x_shdr;    /* Section header table entry, external form */
+  Elf_Internal_Shdr *i_shdrp;  /* Section header table, internal form */
   int shindex;
   char *shstrtab;              /* Internal copy of section header stringtab */
   int shstrtabsize;            /* Size of section header string table */
@@ -695,10 +696,12 @@ wrong:
   /* Switch xvec to match the specified byte order.  */
   switch (x_ehdr.e_ident[EI_DATA]) {
   case ELFDATA2MSB:                    /* Big-endian */ 
-    abfd->xvec = &elf_big_vec;
+    if (!abfd->xvec->header_byteorder_big_p)
+      goto wrong;
     break;
   case ELFDATA2LSB:                    /* Little-endian */
-    abfd->xvec = &elf_little_vec;
+    if (abfd->xvec->header_byteorder_big_p)
+      goto wrong;
     break;
   case ELFDATANONE:                    /* No data encoding specified */
   default:                             /* Unknown data encoding specified */
@@ -734,16 +737,10 @@ wrong:
      check, verify that the what BFD thinks is the size of each section
      header table entry actually matches the size recorded in the file. */
 
-  if (i_ehdr.e_shentsize != sizeof (*x_shdr))
+  if (i_ehdr.e_shentsize != sizeof (x_shdr))
     goto wrong;
-  if ((x_shdr = (Elf_External_Shdr *)
-       bfd_alloc (abfd, sizeof (*x_shdr) * i_ehdr.e_shnum)) == NULL)
-    {
-      bfd_error = no_memory;
-      return (NULL);
-    }
-  if ((i_shdr = (Elf_Internal_Shdr *)
-       bfd_alloc (abfd, sizeof (*i_shdr) * i_ehdr.e_shnum)) == NULL)
+  if ((i_shdrp = (Elf_Internal_Shdr *)
+       bfd_alloc (abfd, sizeof (*i_shdrp) * i_ehdr.e_shnum)) == NULL)
     {
       bfd_error = no_memory;
       return (NULL);
@@ -755,20 +752,20 @@ wrong:
     }
   for (shindex = 0; shindex < i_ehdr.e_shnum; shindex++)
     {
-      if (bfd_read ((PTR) (x_shdr + shindex), sizeof (*x_shdr), 1, abfd)
-         != sizeof (*x_shdr))
+      if (bfd_read ((PTR) &x_shdr, sizeof (x_shdr), 1, abfd)
+         != sizeof (x_shdr))
        {
          bfd_error = system_call_error;
          return (NULL);
        }
-      elf_swap_shdr_in (abfd, x_shdr + shindex, i_shdr + shindex);
+      elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
     }
 
   /* Read in the string table containing the names of the sections.  We
      will need the base pointer to this table later. */
 
-  shstrtabsize = i_shdr[i_ehdr.e_shstrndx].sh_size;
-  offset = i_shdr[i_ehdr.e_shstrndx].sh_offset;
+  shstrtabsize = i_shdrp[i_ehdr.e_shstrndx].sh_size;
+  offset = i_shdrp[i_ehdr.e_shstrndx].sh_offset;
   if ((shstrtab = elf_read (abfd, offset, shstrtabsize)) == NULL)
     {
       return (NULL);
@@ -784,14 +781,14 @@ wrong:
 
   for (shindex = 1; shindex < i_ehdr.e_shnum; shindex++)
     {
-      Elf_Internal_Shdr *hdr = i_shdr + shindex;
+      Elf_Internal_Shdr *hdr = i_shdrp + shindex;
       bfd_section_from_shdr (abfd, hdr, shstrtab);
       if (hdr -> sh_type == SHT_SYMTAB)
        {
-         elf_symtab_filepos(abfd) = hdr -> sh_offset;
-         elf_symtab_filesz(abfd) = hdr -> sh_size;
-         elf_strtab_filepos(abfd) = (i_shdr + hdr -> sh_link) -> sh_offset;
-         elf_strtab_filesz(abfd) = (i_shdr + hdr -> sh_link) -> sh_size;
+         elf_symtab_filepos (abfd) = hdr -> sh_offset;
+         elf_symtab_filesz (abfd) = hdr -> sh_size;
+         elf_strtab_filepos (abfd) = (i_shdrp + hdr -> sh_link) -> sh_offset;
+         elf_strtab_filesz (abfd) = (i_shdrp + hdr -> sh_link) -> sh_size;
        }
     }
 
@@ -820,8 +817,8 @@ DEFUN (elf_core_file_p, (abfd), bfd *abfd)
 {
   Elf_External_Ehdr x_ehdr;    /* Elf file header, external form */
   Elf_Internal_Ehdr i_ehdr;    /* Elf file header, internal form */
-  Elf_External_Phdr *x_phdr;   /* Program header table, external form */
-  Elf_Internal_Phdr *i_phdr  /* Program header table, internal form */
+  Elf_External_Phdr x_phdr;    /* Program header table entry, external form */
+  Elf_Internal_Phdr *i_phdrp;  /* Program header table, internal form */
   int phindex;
   
   /* Read in the ELF header in external format.  */
@@ -899,16 +896,10 @@ wrong:
      check, verify that the what BFD thinks is the size of each program
      header table entry actually matches the size recorded in the file. */
 
-  if (i_ehdr.e_phentsize != sizeof (*x_phdr))
+  if (i_ehdr.e_phentsize != sizeof (x_phdr))
     goto wrong;
-  if ((x_phdr = (Elf_External_Phdr *)
-       bfd_alloc (abfd, sizeof (*x_phdr) * i_ehdr.e_phnum)) == NULL)
-    {
-      bfd_error = no_memory;
-      return (NULL);
-    }
-  if ((i_phdr = (Elf_Internal_Phdr *)
-       bfd_alloc (abfd, sizeof (*i_phdr) * i_ehdr.e_phnum)) == NULL)
+  if ((i_phdrp = (Elf_Internal_Phdr *)
+       bfd_alloc (abfd, sizeof (*i_phdrp) * i_ehdr.e_phnum)) == NULL)
     {
       bfd_error = no_memory;
       return (NULL);
@@ -920,13 +911,13 @@ wrong:
     }
   for (phindex = 0; phindex < i_ehdr.e_phnum; phindex++)
     {
-      if (bfd_read ((PTR) (x_phdr + phindex), sizeof (*x_phdr), 1, abfd)
-         != sizeof (*x_phdr))
+      if (bfd_read ((PTR) &x_phdr, sizeof (x_phdr), 1, abfd)
+         != sizeof (x_phdr))
        {
          bfd_error = system_call_error;
          return (NULL);
        }
-      elf_swap_phdr_in (abfd, x_phdr + phindex, i_phdr + phindex);
+      elf_swap_phdr_in (abfd, &x_phdr, i_phdrp + phindex);
     }
 
   /* Once all of the program headers have been read and converted, we
@@ -934,10 +925,10 @@ wrong:
 
   for (phindex = 0; phindex < i_ehdr.e_phnum; phindex++)
     {
-      bfd_section_from_phdr (abfd, i_phdr + phindex, phindex);
-      if ((i_phdr + phindex) -> p_type == PT_NOTE)
+      bfd_section_from_phdr (abfd, i_phdrp + phindex, phindex);
+      if ((i_phdrp + phindex) -> p_type == PT_NOTE)
        {
-         elf_corefile_note (abfd, i_phdr + phindex);
+         elf_corefile_note (abfd, i_phdrp + phindex);
        }
     }
 
@@ -1054,7 +1045,7 @@ DEFUN (elf_slurp_symbol_table, (abfd), bfd *abfd)
            }
          else if (i_sym.st_shndx == SHN_ABS)
            {
-/*           sym -> flags |= BSF_ABSOLUTE; OBSOLETE */
+             sym -> section = &bfd_abs_section;
            }
          else if (i_sym.st_shndx == SHN_COMMON)
            {