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