dwarf_begin_elf.c revision c07fbb3ff74a8c7b4916ff8155060a35f4b08aaa
1b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Create descriptor from ELF descriptor for processing file. 2c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper Copyright (C) 2002, 2003, 2004, 2005, 2007 Red Hat, Inc. 3361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper This file is part of Red Hat elfutils. 4b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper Written by Ulrich Drepper <drepper@redhat.com>, 2002. 5b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 6361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper Red Hat elfutils is free software; you can redistribute it and/or modify 7361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper it under the terms of the GNU General Public License as published by the 8361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper Free Software Foundation; version 2 of the License. 9b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 10361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper Red Hat elfutils is distributed in the hope that it will be useful, but 11361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper WITHOUT ANY WARRANTY; without even the implied warranty of 12361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper General Public License for more details. 14361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper 15361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper You should have received a copy of the GNU General Public License along 16361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper with Red Hat elfutils; if not, write to the Free Software Foundation, 171e9ef50681e20ef14c2ba38aef37a71ff148be08Ulrich Drepper Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA. 18361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper 19361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper In addition, as a special exception, Red Hat, Inc. gives You the 20361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper additional right to link the code of Red Hat elfutils with code licensed 21361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper under any Open Source Initiative certified open source license 22361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper (http://www.opensource.org/licenses/index.php) which requires the 23361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper distribution of source code with any binary distribution and to 24361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper distribute linked combinations of the two. Non-GPL Code permitted under 25361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper this exception must only link to the code of Red Hat elfutils through 26361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper those well defined interfaces identified in the file named EXCEPTION 27361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper found in the source code files (the "Approved Interfaces"). The files 28361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper of Non-GPL Code may instantiate templates or use macros or inline 29361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper functions from the Approved Interfaces without causing the resulting 30361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper work to be covered by the GNU General Public License. Only Red Hat, 31361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper Inc. may make changes or additions to the list of Approved Interfaces. 32361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper Red Hat's grant of this exception is conditioned upon your not adding 33361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper any new exceptions. If you wish to add a new Approved Interface or 34361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper exception, please contact Red Hat. You must obey the GNU General Public 35361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper License in all respects for all of the Red Hat elfutils code and other 36361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper code used in conjunction with Red Hat elfutils except the Non-GPL Code 37361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper covered by this exception. If you modify this file, you may extend this 38361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper exception to your version of the file, but you are not obligated to do 39361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper so. If you do not wish to provide this exception without modification, 40361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper you must delete this exception statement from your version and license 41361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper this file solely under the GPL without exception. 42361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper 43361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper Red Hat elfutils is an included package of the Open Invention Network. 44361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper An included package of the Open Invention Network is a package for which 45361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper Open Invention Network licensees cross-license their patents. No patent 46361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper license is granted, either expressly or impliedly, by designation as an 47361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper included package. Should you wish to participate in the Open Invention 48361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper Network licensing program, please visit www.openinventionnetwork.com 49361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper <http://www.openinventionnetwork.com>. */ 50b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 51b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#ifdef HAVE_CONFIG_H 52b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper# include <config.h> 53b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#endif 54b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 55b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <stdbool.h> 56b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <stddef.h> 57b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <stdlib.h> 58b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <string.h> 59b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <unistd.h> 60b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <sys/stat.h> 61b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 62b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include "libdwP.h" 63b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 64b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 65b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Section names. */ 66b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic const char dwarf_scnnames[IDX_last][17] = 67b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{ 68b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper [IDX_debug_info] = ".debug_info", 69b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper [IDX_debug_abbrev] = ".debug_abbrev", 70b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper [IDX_debug_aranges] = ".debug_aranges", 71b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper [IDX_debug_line] = ".debug_line", 72b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper [IDX_debug_frame] = ".debug_frame", 73b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper [IDX_eh_frame] = ".eh_frame", 74b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper [IDX_debug_loc] = ".debug_loc", 75b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper [IDX_debug_pubnames] = ".debug_pubnames", 76b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper [IDX_debug_str] = ".debug_str", 77b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper [IDX_debug_funcnames] = ".debug_funcnames", 78b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper [IDX_debug_typenames] = ".debug_typenames", 79b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper [IDX_debug_varnames] = ".debug_varnames", 80b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper [IDX_debug_weaknames] = ".debug_weaknames", 81b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper [IDX_debug_macinfo] = ".debug_macinfo", 82b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper [IDX_debug_ranges] = ".debug_ranges" 83b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper}; 84b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#define ndwarf_scnnames (sizeof (dwarf_scnnames) / sizeof (dwarf_scnnames[0])) 85b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 86b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 87c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepperstatic Dwarf * 88b08d5a8fb42f4586d756068065186b5af7e48daUlrich Dreppercheck_section (Dwarf *result, GElf_Ehdr *ehdr, Elf_Scn *scn, bool inscngrp) 89b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{ 90b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper GElf_Shdr shdr_mem; 91b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper GElf_Shdr *shdr; 92b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 93b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* Get the section header data. */ 94b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper shdr = gelf_getshdr (scn, &shdr_mem); 95b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper if (shdr == NULL) 96b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* This should never happen. If it does something is 97b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper wrong in the libelf library. */ 98b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper abort (); 99b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 100b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 101b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* Make sure the section is part of a section group only iff we 102b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper really need it. If we are looking for the global (= non-section 103b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper group debug info) we have to ignore all the info in section 104b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper groups. If we are looking into a section group we cannot look at 105b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper a section which isn't part of the section group. */ 106b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper if (! inscngrp && (shdr->sh_flags & SHF_GROUP) != 0) 107b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* Ignore the section. */ 108c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper return result; 109b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 110b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 111b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* We recognize the DWARF section by their names. This is not very 112b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper safe and stable but the best we can do. */ 113b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper const char *scnname = elf_strptr (result->elf, ehdr->e_shstrndx, 114b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper shdr->sh_name); 115b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper if (scnname == NULL) 116b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper { 117b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* The section name must be valid. Otherwise is the ELF file 118b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper invalid. */ 119b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper __libdw_seterrno (DWARF_E_INVALID_ELF); 120b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper free (result); 121c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper return NULL; 122b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper } 123b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 124b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 125b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* Recognize the various sections. Most names start with .debug_. */ 126b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper size_t cnt; 127b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper for (cnt = 0; cnt < ndwarf_scnnames; ++cnt) 128b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper if (strcmp (scnname, dwarf_scnnames[cnt]) == 0) 129b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper { 130b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* Found it. Remember where the data is. */ 131b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper if (unlikely (result->sectiondata[cnt] != NULL)) 132b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* A section appears twice. That's bad. We ignore the section. */ 133b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper break; 134b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 135b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* Get the section data. */ 136b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper Elf_Data *data = elf_getdata (scn, NULL); 137b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper if (data != NULL && data->d_size != 0) 138b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* Yep, there is actually data available. */ 139b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper result->sectiondata[cnt] = data; 140b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 141b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper break; 142b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper } 143c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper 144c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper return result; 145b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper} 146b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 147b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 148b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Check whether all the necessary DWARF information is available. */ 149b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic Dwarf * 150b08d5a8fb42f4586d756068065186b5af7e48daUlrich Dreppervalid_p (Dwarf *result) 151b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{ 152b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* We looked at all the sections. Now determine whether all the 153b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper sections with debugging information we need are there. 154b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 155b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper XXX Which sections are absolutely necessary? Add tests if 156b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper necessary. For now we require only .debug_info. Hopefully this 157b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper is correct. */ 158c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper if (likely (result != NULL) 159c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper && unlikely (result->sectiondata[IDX_debug_info] == NULL)) 160b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper { 161b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper __libdw_seterrno (DWARF_E_NO_DWARF); 162c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper free (result); 163b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper result = NULL; 164b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper } 165b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 166b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper return result; 167b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper} 168b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 169b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 170b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic Dwarf * 171b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperglobal_read (Dwarf *result, Elf *elf, GElf_Ehdr *ehdr) 172b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{ 173b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper Elf_Scn *scn = NULL; 174b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 175c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper while (result != NULL && (scn = elf_nextscn (elf, scn)) != NULL) 176c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper result = check_section (result, ehdr, scn, false); 177b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 178b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper return valid_p (result); 179b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper} 180b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 181b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 182b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic Dwarf * 183b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperscngrp_read (Dwarf *result, Elf *elf, GElf_Ehdr *ehdr, Elf_Scn *scngrp) 184b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{ 185b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* SCNGRP is the section descriptor for a section group which might 186b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper contain debug sections. */ 187b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper Elf_Data *data = elf_getdata (scngrp, NULL); 188b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper if (data == NULL) 189b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper { 190b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* We cannot read the section content. Fail! */ 191b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper free (result); 192b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper return NULL; 193b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper } 194b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 195b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* The content of the section is a number of 32-bit words which 196b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper represent section indices. The first word is a flag word. */ 197b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper Elf32_Word *scnidx = (Elf32_Word *) data->d_buf; 198b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper size_t cnt; 199b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper for (cnt = 1; cnt * sizeof (Elf32_Word) <= data->d_size; ++cnt) 200b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper { 201b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper Elf_Scn *scn = elf_getscn (elf, scnidx[cnt]); 202b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper if (scn == NULL) 203b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper { 204b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* A section group refers to a non-existing section. Should 205b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper never happen. */ 206b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper __libdw_seterrno (DWARF_E_INVALID_ELF); 207b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper free (result); 208b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper return NULL; 209b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper } 210b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 211c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper result = check_section (result, ehdr, scn, true); 212c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper if (result == NULL) 213c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper break; 214b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper } 215b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 216b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper return valid_p (result); 217b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper} 218b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 219b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 220b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperDwarf * 221b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperdwarf_begin_elf (elf, cmd, scngrp) 222b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper Elf *elf; 223b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper Dwarf_Cmd cmd; 224b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper Elf_Scn *scngrp; 225b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{ 226b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper GElf_Ehdr *ehdr; 227b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper GElf_Ehdr ehdr_mem; 228b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 229b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* Get the ELF header of the file. We need various pieces of 230b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper information from it. */ 231b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper ehdr = gelf_getehdr (elf, &ehdr_mem); 232b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper if (ehdr == NULL) 233b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper { 234b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper if (elf_kind (elf) != ELF_K_ELF) 235b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper __libdw_seterrno (DWARF_E_NOELF); 236b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper else 237b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper __libdw_seterrno (DWARF_E_GETEHDR_ERROR); 238b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 239b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper return NULL; 240b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper } 241b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 242b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 243b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* Default memory allocation size. */ 244b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper size_t mem_default_size = sysconf (_SC_PAGESIZE) - 4 * sizeof (void *); 245b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 246b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* Allocate the data structure. */ 247b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper Dwarf *result = (Dwarf *) calloc (1, sizeof (Dwarf) + mem_default_size); 248b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper if (result == NULL) 249b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper { 250b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper __libdw_seterrno (DWARF_E_NOMEM); 251b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper return NULL; 252b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper } 253b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 254b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* Fill in some values. */ 255b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper if ((BYTE_ORDER == LITTLE_ENDIAN && ehdr->e_ident[EI_DATA] == ELFDATA2MSB) 256b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper || (BYTE_ORDER == BIG_ENDIAN && ehdr->e_ident[EI_DATA] == ELFDATA2LSB)) 257b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper result->other_byte_order = true; 258b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 259b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper result->elf = elf; 260b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 261b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* Initialize the memory handling. */ 262b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper result->mem_default_size = mem_default_size; 263b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper result->oom_handler = __libdw_oom; 264b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper result->mem_tail = (struct libdw_memblock *) (result + 1); 265b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper result->mem_tail->size = (result->mem_default_size 266b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper - offsetof (struct libdw_memblock, mem)); 267b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper result->mem_tail->remaining = result->mem_tail->size; 268b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper result->mem_tail->prev = NULL; 269b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 270b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 271b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper if (cmd == DWARF_C_READ || cmd == DWARF_C_RDWR) 272b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper { 273b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* If the caller provides a section group we get the DWARF 274b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper sections only from this setion group. Otherwise we search 275b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper for the first section with the required name. Further 276b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper sections with the name are ignored. The DWARF specification 277b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper does not really say this is allowed. */ 278b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper if (scngrp == NULL) 279b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper return global_read (result, elf, ehdr); 280b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper else 281b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper return scngrp_read (result, elf, ehdr, scngrp); 282b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper } 283b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper else if (cmd == DWARF_C_WRITE) 284b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper { 285b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper __libdw_seterrno (DWARF_E_UNIMPL); 286b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper free (result); 287b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper return NULL; 288b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper } 289b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 290b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper __libdw_seterrno (DWARF_E_INVALID_CMD); 291b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper free (result); 292b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper return NULL; 293b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper} 294b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDEF(dwarf_begin_elf) 295