Home | History | Annotate | Download | only in libelf
      1 /* Get ELF header.
      2    Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
      3    Written by Ulrich Drepper <drepper (at) redhat.com>, 1998.
      4 
      5    This program is free software; you can redistribute it and/or modify
      6    it under the terms of the GNU General Public License as published by
      7    the Free Software Foundation, version 2.
      8 
      9    This program is distributed in the hope that it will be useful,
     10    but WITHOUT ANY WARRANTY; without even the implied warranty of
     11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     12    GNU General Public License for more details.
     13 
     14    You should have received a copy of the GNU General Public License
     15    along with this program; if not, write to the Free Software Foundation,
     16    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
     17 
     18 #ifdef HAVE_CONFIG_H
     19 # include <config.h>
     20 #endif
     21 
     22 #include <gelf.h>
     23 #include <string.h>
     24 
     25 #include "libelfP.h"
     26 
     27 
     28 GElf_Ehdr *
     29 gelf_getehdr (elf, dest)
     30      Elf *elf;
     31      GElf_Ehdr *dest;
     32 {
     33   GElf_Ehdr *result = NULL;
     34 
     35   if (elf == NULL)
     36     return NULL;
     37 
     38   if (unlikely (elf->kind != ELF_K_ELF))
     39     {
     40       __libelf_seterrno (ELF_E_INVALID_HANDLE);
     41       return NULL;
     42     }
     43 
     44   rwlock_rdlock (elf->lock);
     45 
     46   if (elf->class == ELFCLASS32)
     47     {
     48       Elf32_Ehdr *ehdr = elf->state.elf32.ehdr;
     49 
     50       /* Maybe no ELF header was created yet.  */
     51       if (ehdr == NULL)
     52 	__libelf_seterrno (ELF_E_WRONG_ORDER_EHDR);
     53       else
     54 	{
     55 	  /* Convert the 32-bit struct to an 64-bit one.  */
     56 	  memcpy (dest->e_ident, ehdr->e_ident, EI_NIDENT);
     57 #define COPY(name) \
     58 	  dest->name = ehdr->name
     59 	  COPY (e_type);
     60 	  COPY (e_machine);
     61 	  COPY (e_version);
     62 	  COPY (e_entry);
     63 	  COPY (e_phoff);
     64 	  COPY (e_shoff);
     65 	  COPY (e_flags);
     66 	  COPY (e_ehsize);
     67 	  COPY (e_phentsize);
     68 	  COPY (e_phnum);
     69 	  COPY (e_shentsize);
     70 	  COPY (e_shnum);
     71 	  COPY (e_shstrndx);
     72 
     73 	  result = dest;
     74 	}
     75     }
     76   else
     77     {
     78       /* Maybe no ELF header was created yet.  */
     79       if (elf->state.elf64.ehdr == NULL)
     80 	__libelf_seterrno (ELF_E_WRONG_ORDER_EHDR);
     81       else
     82 	result = memcpy (dest, elf->state.elf64.ehdr, sizeof (*dest));
     83     }
     84 
     85   rwlock_unlock (elf->lock);
     86 
     87   return result;
     88 }
     89