Home | History | Annotate | Download | only in bfd
      1 /* ELF core file support for BFD.
      2    Copyright (C) 1995-2014 Free Software Foundation, Inc.
      3 
      4    This file is part of BFD, the Binary File Descriptor library.
      5 
      6    This program is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 3 of the License, or
      9    (at your option) any later version.
     10 
     11    This program is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with this program; if not, write to the Free Software
     18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     19    MA 02110-1301, USA.  */
     20 
     21 char*
     22 elf_core_file_failing_command (bfd *abfd)
     23 {
     24   return elf_tdata (abfd)->core->command;
     25 }
     26 
     27 int
     28 elf_core_file_failing_signal (bfd *abfd)
     29 {
     30   return elf_tdata (abfd)->core->signal;
     31 }
     32 
     33 int
     34 elf_core_file_pid (bfd *abfd)
     35 {
     36   return elf_tdata (abfd)->core->pid;
     37 }
     38 
     39 bfd_boolean
     40 elf_core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd)
     41 {
     42   char* corename;
     43 
     44   /* xvecs must match if both are ELF files for the same target.  */
     45 
     46   if (core_bfd->xvec != exec_bfd->xvec)
     47     {
     48       bfd_set_error (bfd_error_system_call);
     49       return FALSE;
     50     }
     51 
     52   /* See if the name in the corefile matches the executable name.  */
     53   corename = elf_tdata (core_bfd)->core->program;
     54   if (corename != NULL)
     55     {
     56       const char* execname = strrchr (exec_bfd->filename, '/');
     57 
     58       execname = execname ? execname + 1 : exec_bfd->filename;
     59 
     60       if (strcmp (execname, corename) != 0)
     61 	return FALSE;
     62     }
     63 
     64   return TRUE;
     65 }
     66 
     67 /*  Core files are simply standard ELF formatted files that partition
     68     the file using the execution view of the file (program header table)
     69     rather than the linking view.  In fact, there is no section header
     70     table in a core file.
     71 
     72     The process status information (including the contents of the general
     73     register set) and the floating point register set are stored in a
     74     segment of type PT_NOTE.  We handcraft a couple of extra bfd sections
     75     that allow standard bfd access to the general registers (.reg) and the
     76     floating point registers (.reg2).  */
     77 
     78 const bfd_target *
     79 elf_core_file_p (bfd *abfd)
     80 {
     81   Elf_External_Ehdr x_ehdr;	/* Elf file header, external form.  */
     82   Elf_Internal_Ehdr *i_ehdrp;	/* Elf file header, internal form.  */
     83   Elf_Internal_Phdr *i_phdrp;	/* Elf program header, internal form.  */
     84   unsigned int phindex;
     85   const struct elf_backend_data *ebd;
     86   bfd_size_type amt;
     87 
     88   /* Read in the ELF header in external format.  */
     89   if (bfd_bread (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
     90     {
     91       if (bfd_get_error () != bfd_error_system_call)
     92 	goto wrong;
     93       else
     94 	goto fail;
     95     }
     96 
     97   /* Check the magic number.  */
     98   if (! elf_file_p (&x_ehdr))
     99     goto wrong;
    100 
    101   /* FIXME: Check EI_VERSION here !  */
    102 
    103   /* Check the address size ("class").  */
    104   if (x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
    105     goto wrong;
    106 
    107   /* Check the byteorder.  */
    108   switch (x_ehdr.e_ident[EI_DATA])
    109     {
    110     case ELFDATA2MSB:		/* Big-endian.  */
    111       if (! bfd_big_endian (abfd))
    112 	goto wrong;
    113       break;
    114     case ELFDATA2LSB:		/* Little-endian.  */
    115       if (! bfd_little_endian (abfd))
    116 	goto wrong;
    117       break;
    118     default:
    119       goto wrong;
    120     }
    121 
    122   /* Give abfd an elf_obj_tdata.  */
    123   if (! (*abfd->xvec->_bfd_set_format[bfd_core]) (abfd))
    124     goto fail;
    125 
    126   /* Swap in the rest of the header, now that we have the byte order.  */
    127   i_ehdrp = elf_elfheader (abfd);
    128   elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
    129 
    130 #if DEBUG & 1
    131   elf_debug_file (i_ehdrp);
    132 #endif
    133 
    134   ebd = get_elf_backend_data (abfd);
    135 
    136   /* Check that the ELF e_machine field matches what this particular
    137      BFD format expects.  */
    138 
    139   if (ebd->elf_machine_code != i_ehdrp->e_machine
    140       && (ebd->elf_machine_alt1 == 0
    141 	  || i_ehdrp->e_machine != ebd->elf_machine_alt1)
    142       && (ebd->elf_machine_alt2 == 0
    143 	  || i_ehdrp->e_machine != ebd->elf_machine_alt2))
    144     {
    145       const bfd_target * const *target_ptr;
    146 
    147       if (ebd->elf_machine_code != EM_NONE)
    148 	goto wrong;
    149 
    150       /* This is the generic ELF target.  Let it match any ELF target
    151 	 for which we do not have a specific backend.  */
    152 
    153       for (target_ptr = bfd_target_vector; *target_ptr != NULL; target_ptr++)
    154 	{
    155 	  const struct elf_backend_data *back;
    156 
    157 	  if ((*target_ptr)->flavour != bfd_target_elf_flavour)
    158 	    continue;
    159 	  back = xvec_get_elf_backend_data (*target_ptr);
    160 	  if (back->s->arch_size != ARCH_SIZE)
    161 	    continue;
    162 	  if (back->elf_machine_code == i_ehdrp->e_machine
    163 	      || (back->elf_machine_alt1 != 0
    164 	          && i_ehdrp->e_machine == back->elf_machine_alt1)
    165 	      || (back->elf_machine_alt2 != 0
    166 	          && i_ehdrp->e_machine == back->elf_machine_alt2))
    167 	    {
    168 	      /* target_ptr is an ELF backend which matches this
    169 		 object file, so reject the generic ELF target.  */
    170 	      goto wrong;
    171 	    }
    172 	}
    173     }
    174 
    175   /* If there is no program header, or the type is not a core file, then
    176      we are hosed.  */
    177   if (i_ehdrp->e_phoff == 0 || i_ehdrp->e_type != ET_CORE)
    178     goto wrong;
    179 
    180   /* Does BFD's idea of the phdr size match the size
    181      recorded in the file? */
    182   if (i_ehdrp->e_phentsize != sizeof (Elf_External_Phdr))
    183     goto wrong;
    184 
    185   /* If the program header count is PN_XNUM(0xffff), the actual
    186      count is in the first section header.  */
    187   if (i_ehdrp->e_shoff != 0 && i_ehdrp->e_phnum == PN_XNUM)
    188     {
    189       Elf_External_Shdr x_shdr;
    190       Elf_Internal_Shdr i_shdr;
    191       bfd_signed_vma where = i_ehdrp->e_shoff;
    192 
    193       if (where != (file_ptr) where)
    194 	goto wrong;
    195 
    196       /* Seek to the section header table in the file.  */
    197       if (bfd_seek (abfd, (file_ptr) where, SEEK_SET) != 0)
    198 	goto fail;
    199 
    200       /* Read the first section header at index 0, and convert to internal
    201 	 form.  */
    202       if (bfd_bread (&x_shdr, sizeof (x_shdr), abfd) != sizeof (x_shdr))
    203 	goto fail;
    204       elf_swap_shdr_in (abfd, &x_shdr, &i_shdr);
    205 
    206       if (i_shdr.sh_info != 0)
    207 	{
    208 	  i_ehdrp->e_phnum = i_shdr.sh_info;
    209 	  if (i_ehdrp->e_phnum != i_shdr.sh_info)
    210 	    goto wrong;
    211 	}
    212     }
    213 
    214   /* Sanity check that we can read all of the program headers.
    215      It ought to be good enough to just read the last one.  */
    216   if (i_ehdrp->e_phnum > 1)
    217     {
    218       Elf_External_Phdr x_phdr;
    219       Elf_Internal_Phdr i_phdr;
    220       bfd_signed_vma where;
    221 
    222       /* Check that we don't have a totally silly number of
    223 	 program headers.  */
    224       if (i_ehdrp->e_phnum > (unsigned int) -1 / sizeof (x_phdr)
    225 	  || i_ehdrp->e_phnum > (unsigned int) -1 / sizeof (i_phdr))
    226 	goto wrong;
    227 
    228       where = i_ehdrp->e_phoff + (i_ehdrp->e_phnum - 1) * sizeof (x_phdr);
    229       if (where != (file_ptr) where)
    230 	goto wrong;
    231       if ((bfd_size_type) where <= i_ehdrp->e_phoff)
    232 	goto wrong;
    233 
    234       if (bfd_seek (abfd, (file_ptr) where, SEEK_SET) != 0)
    235 	goto fail;
    236       if (bfd_bread (&x_phdr, sizeof (x_phdr), abfd) != sizeof (x_phdr))
    237 	goto fail;
    238     }
    239 
    240   /* Move to the start of the program headers.  */
    241   if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
    242     goto wrong;
    243 
    244   /* Allocate space for the program headers.  */
    245   amt = sizeof (*i_phdrp) * i_ehdrp->e_phnum;
    246   i_phdrp = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
    247   if (!i_phdrp)
    248     goto fail;
    249 
    250   elf_tdata (abfd)->phdr = i_phdrp;
    251 
    252   /* Read and convert to internal form.  */
    253   for (phindex = 0; phindex < i_ehdrp->e_phnum; ++phindex)
    254     {
    255       Elf_External_Phdr x_phdr;
    256 
    257       if (bfd_bread (&x_phdr, sizeof (x_phdr), abfd) != sizeof (x_phdr))
    258 	goto fail;
    259 
    260       elf_swap_phdr_in (abfd, &x_phdr, i_phdrp + phindex);
    261     }
    262 
    263   /* Set the machine architecture.  Do this before processing the
    264      program headers since we need to know the architecture type
    265      when processing the notes of some systems' core files.  */
    266   if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0)
    267       /* It's OK if this fails for the generic target.  */
    268       && ebd->elf_machine_code != EM_NONE)
    269     goto fail;
    270 
    271   /* Let the backend double check the format and override global
    272      information.  We do this before processing the program headers
    273      to allow the correct machine (as opposed to just the default
    274      machine) to be set, making it possible for grok_prstatus and
    275      grok_psinfo to rely on the mach setting.  */
    276   if (ebd->elf_backend_object_p != NULL
    277       && ! ebd->elf_backend_object_p (abfd))
    278     goto wrong;
    279 
    280   /* Process each program header.  */
    281   for (phindex = 0; phindex < i_ehdrp->e_phnum; ++phindex)
    282     if (! bfd_section_from_phdr (abfd, i_phdrp + phindex, (int) phindex))
    283       goto fail;
    284 
    285   /* Check for core truncation.  */
    286   {
    287     bfd_size_type high = 0;
    288     struct stat statbuf;
    289     for (phindex = 0; phindex < i_ehdrp->e_phnum; ++phindex)
    290       {
    291 	Elf_Internal_Phdr *p = i_phdrp + phindex;
    292 	if (p->p_filesz)
    293 	  {
    294 	    bfd_size_type current = p->p_offset + p->p_filesz;
    295 	    if (high < current)
    296 	      high = current;
    297 	  }
    298       }
    299     if (bfd_stat (abfd, &statbuf) == 0)
    300       {
    301 	if ((bfd_size_type) statbuf.st_size < high)
    302 	  {
    303 	    (*_bfd_error_handler)
    304 	      (_("Warning: %B is truncated: expected core file "
    305 		 "size >= %lu, found: %lu."),
    306 	       abfd, (unsigned long) high, (unsigned long) statbuf.st_size);
    307 	  }
    308       }
    309   }
    310 
    311   /* Save the entry point from the ELF header.  */
    312   bfd_get_start_address (abfd) = i_ehdrp->e_entry;
    313   return abfd->xvec;
    314 
    315 wrong:
    316   bfd_set_error (bfd_error_wrong_format);
    317 fail:
    318   return NULL;
    319 }
    320