dwarf_begin_elf.c revision 9202665816763fad8524dd78a664dbcaa157b8d4
1b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Create descriptor from ELF descriptor for processing file.
27f1eec317db79627b473c5b149a22a1b20d1f68fMark Wielaard   Copyright (C) 2002-2011, 2014 Red Hat, Inc.
3de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   This file is part of elfutils.
4b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   Written by Ulrich Drepper <drepper@redhat.com>, 2002.
5b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
6de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   This file is free software; you can redistribute it and/or modify
7de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   it under the terms of either
8b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
9de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard     * the GNU Lesser General Public License as published by the Free
10de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard       Software Foundation; either version 3 of the License, or (at
11de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard       your option) any later version
12de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard
13de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   or
14de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard
15de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard     * the GNU General Public License as published by the Free
16de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard       Software Foundation; either version 2 of the License, or (at
17de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard       your option) any later version
18de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard
19de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   or both in parallel, as here.
20de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard
21de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   elfutils is distributed in the hope that it will be useful, but
22361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper   WITHOUT ANY WARRANTY; without even the implied warranty of
23361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper   General Public License for more details.
25361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper
26de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   You should have received copies of the GNU General Public License and
27de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   the GNU Lesser General Public License along with this program.  If
28de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   not, see <http://www.gnu.org/licenses/>.  */
29b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
30b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#ifdef HAVE_CONFIG_H
31b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper# include <config.h>
32b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#endif
33b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
34775375e3bd177cb19acb5020b6e0917551807276Mark Wielaard#include <assert.h>
35b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <stdbool.h>
36b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <stddef.h>
37b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <stdlib.h>
38775375e3bd177cb19acb5020b6e0917551807276Mark Wielaard#include <stdio.h>
39b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <string.h>
40b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <unistd.h>
41775375e3bd177cb19acb5020b6e0917551807276Mark Wielaard#include <sys/types.h>
42b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <sys/stat.h>
43775375e3bd177cb19acb5020b6e0917551807276Mark Wielaard#include <fcntl.h>
44b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
45b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include "libdwP.h"
46b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
47725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath#if USE_ZLIB
48725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath# include <endian.h>
49725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath# define crc32		loser_crc32
50725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath# include <zlib.h>
51725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath# undef crc32
52725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath#endif
53725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath
54b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
55b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Section names.  */
56efa72a02de8a3bbbc43c8de659697df5d425ea7eFlorian Weimerstatic const char dwarf_scnnames[IDX_last][18] =
57b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
58b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  [IDX_debug_info] = ".debug_info",
59827d4d176b989c5d765c7f349edff6f994f8ea78Roland McGrath  [IDX_debug_types] = ".debug_types",
60b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  [IDX_debug_abbrev] = ".debug_abbrev",
61b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  [IDX_debug_aranges] = ".debug_aranges",
62b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  [IDX_debug_line] = ".debug_line",
63b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  [IDX_debug_frame] = ".debug_frame",
64b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  [IDX_debug_loc] = ".debug_loc",
65b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  [IDX_debug_pubnames] = ".debug_pubnames",
66b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  [IDX_debug_str] = ".debug_str",
67b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  [IDX_debug_macinfo] = ".debug_macinfo",
68a0172d75311f36adb6db58000474d31f8a9cd553Mark Wielaard  [IDX_debug_macro] = ".debug_macro",
69efa72a02de8a3bbbc43c8de659697df5d425ea7eFlorian Weimer  [IDX_debug_ranges] = ".debug_ranges",
70efa72a02de8a3bbbc43c8de659697df5d425ea7eFlorian Weimer  [IDX_gnu_debugaltlink] = ".gnu_debugaltlink"
71b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper};
72b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#define ndwarf_scnnames (sizeof (dwarf_scnnames) / sizeof (dwarf_scnnames[0]))
73b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
74c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepperstatic Dwarf *
75b08d5a8fb42f4586d756068065186b5af7e48daUlrich Dreppercheck_section (Dwarf *result, GElf_Ehdr *ehdr, Elf_Scn *scn, bool inscngrp)
76b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
77b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  GElf_Shdr shdr_mem;
78b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  GElf_Shdr *shdr;
79b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
80b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Get the section header data.  */
81b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  shdr = gelf_getshdr (scn, &shdr_mem);
82b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (shdr == NULL)
83dff2a99d84a756792f65d31fa19becce792f2ca5Jan Kratochvil    /* We may read /proc/PID/mem with only program headers mapped and section
84dff2a99d84a756792f65d31fa19becce792f2ca5Jan Kratochvil       headers out of the mapped pages.  */
85dff2a99d84a756792f65d31fa19becce792f2ca5Jan Kratochvil    goto err;
86b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
87b597dfad924980dede10d7c19d87900b6172e599Ulrich Drepper  /* Ignore any SHT_NOBITS sections.  Debugging sections should not
88b597dfad924980dede10d7c19d87900b6172e599Ulrich Drepper     have been stripped, but in case of a corrupt file we won't try
89b597dfad924980dede10d7c19d87900b6172e599Ulrich Drepper     to look at the missing data.  */
90b597dfad924980dede10d7c19d87900b6172e599Ulrich Drepper  if (unlikely (shdr->sh_type == SHT_NOBITS))
91b597dfad924980dede10d7c19d87900b6172e599Ulrich Drepper    return result;
92b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
93b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Make sure the section is part of a section group only iff we
94b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     really need it.  If we are looking for the global (= non-section
95b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     group debug info) we have to ignore all the info in section
96b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     groups.  If we are looking into a section group we cannot look at
97b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     a section which isn't part of the section group.  */
98b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (! inscngrp && (shdr->sh_flags & SHF_GROUP) != 0)
99b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    /* Ignore the section.  */
100c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper    return result;
101b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
102b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
103b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* We recognize the DWARF section by their names.  This is not very
104b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     safe and stable but the best we can do.  */
105b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  const char *scnname = elf_strptr (result->elf, ehdr->e_shstrndx,
106b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper				    shdr->sh_name);
107b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (scnname == NULL)
108b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
109b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      /* The section name must be valid.  Otherwise is the ELF file
110b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	 invalid.  */
111dff2a99d84a756792f65d31fa19becce792f2ca5Jan Kratochvil    err:
112725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath      __libdw_free_zdata (result);
11359254427e7c9eeb697de00069a9cb7dc1c908f86Mark Wielaard      Dwarf_Sig8_Hash_free (&result->sig8_hash);
114b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      __libdw_seterrno (DWARF_E_INVALID_ELF);
115b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      free (result);
116c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper      return NULL;
117b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
118b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
119b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Recognize the various sections.  Most names start with .debug_.  */
120b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  size_t cnt;
121b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  for (cnt = 0; cnt < ndwarf_scnnames; ++cnt)
122b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    if (strcmp (scnname, dwarf_scnnames[cnt]) == 0)
123b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      {
124b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	/* Found it.  Remember where the data is.  */
125b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	if (unlikely (result->sectiondata[cnt] != NULL))
126b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  /* A section appears twice.  That's bad.  We ignore the section.  */
127b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  break;
128b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
129b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	/* Get the section data.  */
130b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	Elf_Data *data = elf_getdata (scn, NULL);
131b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	if (data != NULL && data->d_size != 0)
132b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  /* Yep, there is actually data available.  */
133b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  result->sectiondata[cnt] = data;
134b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
135b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	break;
136b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      }
137725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath#if USE_ZLIB
138725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath    else if (scnname[0] == '.' && scnname[1] == 'z'
139725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	     && strcmp (&scnname[2], &dwarf_scnnames[cnt][1]) == 0)
140725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath      {
141725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	/* A compressed section.  */
142725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath
143725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	if (unlikely (result->sectiondata[cnt] != NULL))
144725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	  /* A section appears twice.  That's bad.  We ignore the section.  */
145725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	  break;
146725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath
147725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	/* Get the section data.  */
148725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	Elf_Data *data = elf_getdata (scn, NULL);
149725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	if (data != NULL && data->d_size != 0)
150725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	  {
151725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	    /* There is a 12-byte header of "ZLIB" followed by
152725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	       an 8-byte big-endian size.  */
153725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath
154725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	    if (unlikely (data->d_size < 4 + 8)
155725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath		|| unlikely (memcmp (data->d_buf, "ZLIB", 4) != 0))
156725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	      break;
157725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath
158725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	    uint64_t size;
159725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	    memcpy (&size, data->d_buf + 4, sizeof size);
160725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	    size = be64toh (size);
161725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath
1627f1eec317db79627b473c5b149a22a1b20d1f68fMark Wielaard	    /* Check for unsigned overflow so malloc always allocated
1637f1eec317db79627b473c5b149a22a1b20d1f68fMark Wielaard	       enough memory for both the Elf_Data header and the
1647f1eec317db79627b473c5b149a22a1b20d1f68fMark Wielaard	       uncompressed section data.  */
1657f1eec317db79627b473c5b149a22a1b20d1f68fMark Wielaard	    if (unlikely (sizeof (Elf_Data) + size < size))
1667f1eec317db79627b473c5b149a22a1b20d1f68fMark Wielaard	      break;
1677f1eec317db79627b473c5b149a22a1b20d1f68fMark Wielaard
168725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	    Elf_Data *zdata = malloc (sizeof (Elf_Data) + size);
169725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	    if (unlikely (zdata == NULL))
170725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	      break;
171725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath
172725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	    zdata->d_buf = &zdata[1];
173725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	    zdata->d_type = ELF_T_BYTE;
174725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	    zdata->d_version = EV_CURRENT;
175725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	    zdata->d_size = size;
176725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	    zdata->d_off = 0;
177725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	    zdata->d_align = 1;
178725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath
179725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	    z_stream z =
180725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	      {
181725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath		.next_in = data->d_buf + 4 + 8,
182725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath		.avail_in = data->d_size - 4 - 8,
183725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath		.next_out = zdata->d_buf,
184725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath		.avail_out = zdata->d_size
185725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	      };
186725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	    int zrc = inflateInit (&z);
187725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	    while (z.avail_in > 0 && likely (zrc == Z_OK))
188725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	      {
189725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath		z.next_out = zdata->d_buf + (zdata->d_size - z.avail_out);
190725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath		zrc = inflate (&z, Z_FINISH);
191725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath		if (unlikely (zrc != Z_STREAM_END))
192725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath		  {
193725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath		    zrc = Z_DATA_ERROR;
194725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath		    break;
195725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath		  }
196725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath		zrc = inflateReset (&z);
197725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	      }
198725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	    if (likely (zrc == Z_OK))
199725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	      zrc = inflateEnd (&z);
200725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath
201725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	    if (unlikely (zrc != Z_OK) || unlikely (z.avail_out != 0))
202725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	      free (zdata);
203725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	    else
204725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	      {
205725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath		result->sectiondata[cnt] = zdata;
206725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath		result->sectiondata_gzip_mask |= 1U << cnt;
207725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	      }
208725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	  }
209725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath
210725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	break;
211725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath      }
212725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath#endif
213c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper
214c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper  return result;
215b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper}
216b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
217b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
218b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Check whether all the necessary DWARF information is available.  */
219b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic Dwarf *
220b08d5a8fb42f4586d756068065186b5af7e48daUlrich Dreppervalid_p (Dwarf *result)
221b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
222b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* We looked at all the sections.  Now determine whether all the
223b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     sections with debugging information we need are there.
224b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
225b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     XXX Which sections are absolutely necessary?  Add tests if
226b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     necessary.  For now we require only .debug_info.  Hopefully this
227b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     is correct.  */
228c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper  if (likely (result != NULL)
229c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper      && unlikely (result->sectiondata[IDX_debug_info] == NULL))
230b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
231725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath      __libdw_free_zdata (result);
23259254427e7c9eeb697de00069a9cb7dc1c908f86Mark Wielaard      Dwarf_Sig8_Hash_free (&result->sig8_hash);
233b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      __libdw_seterrno (DWARF_E_NO_DWARF);
234c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper      free (result);
235b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      result = NULL;
236b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
237b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
2389202665816763fad8524dd78a664dbcaa157b8d4Mark Wielaard  if (result != NULL && result->sectiondata[IDX_debug_loc] != NULL)
2399202665816763fad8524dd78a664dbcaa157b8d4Mark Wielaard    {
2409202665816763fad8524dd78a664dbcaa157b8d4Mark Wielaard      result->fake_loc_cu = (Dwarf_CU *) calloc (1, sizeof (Dwarf_CU));
2419202665816763fad8524dd78a664dbcaa157b8d4Mark Wielaard      if (unlikely (result->fake_loc_cu == NULL))
2429202665816763fad8524dd78a664dbcaa157b8d4Mark Wielaard	{
2439202665816763fad8524dd78a664dbcaa157b8d4Mark Wielaard	  __libdw_free_zdata (result);
2449202665816763fad8524dd78a664dbcaa157b8d4Mark Wielaard	  Dwarf_Sig8_Hash_free (&result->sig8_hash);
2459202665816763fad8524dd78a664dbcaa157b8d4Mark Wielaard	  __libdw_seterrno (DWARF_E_NOMEM);
2469202665816763fad8524dd78a664dbcaa157b8d4Mark Wielaard	  free (result);
2479202665816763fad8524dd78a664dbcaa157b8d4Mark Wielaard	  result = NULL;
2489202665816763fad8524dd78a664dbcaa157b8d4Mark Wielaard	}
2499202665816763fad8524dd78a664dbcaa157b8d4Mark Wielaard      else
2509202665816763fad8524dd78a664dbcaa157b8d4Mark Wielaard	{
2519202665816763fad8524dd78a664dbcaa157b8d4Mark Wielaard	  result->fake_loc_cu->dbg = result;
2529202665816763fad8524dd78a664dbcaa157b8d4Mark Wielaard	  result->fake_loc_cu->startp
2539202665816763fad8524dd78a664dbcaa157b8d4Mark Wielaard	    = result->sectiondata[IDX_debug_loc]->d_buf;
2549202665816763fad8524dd78a664dbcaa157b8d4Mark Wielaard	  result->fake_loc_cu->endp
2559202665816763fad8524dd78a664dbcaa157b8d4Mark Wielaard	    = (result->sectiondata[IDX_debug_loc]->d_buf
2569202665816763fad8524dd78a664dbcaa157b8d4Mark Wielaard	       + result->sectiondata[IDX_debug_loc]->d_size);
2579202665816763fad8524dd78a664dbcaa157b8d4Mark Wielaard	}
2589202665816763fad8524dd78a664dbcaa157b8d4Mark Wielaard    }
2599202665816763fad8524dd78a664dbcaa157b8d4Mark Wielaard
260b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  return result;
261b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper}
262b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
263b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
264b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic Dwarf *
265b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperglobal_read (Dwarf *result, Elf *elf, GElf_Ehdr *ehdr)
266b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
267b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Elf_Scn *scn = NULL;
268b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
269c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper  while (result != NULL && (scn = elf_nextscn (elf, scn)) != NULL)
270c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper    result = check_section (result, ehdr, scn, false);
271b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
272b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  return valid_p (result);
273b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper}
274b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
275b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
276b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic Dwarf *
277b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperscngrp_read (Dwarf *result, Elf *elf, GElf_Ehdr *ehdr, Elf_Scn *scngrp)
278b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
279b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* SCNGRP is the section descriptor for a section group which might
280b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     contain debug sections.  */
281b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Elf_Data *data = elf_getdata (scngrp, NULL);
282b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (data == NULL)
283b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
284b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      /* We cannot read the section content.  Fail!  */
285725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath      __libdw_free_zdata (result);
28659254427e7c9eeb697de00069a9cb7dc1c908f86Mark Wielaard      Dwarf_Sig8_Hash_free (&result->sig8_hash);
287b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      free (result);
288b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      return NULL;
289b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
290b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
291b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* The content of the section is a number of 32-bit words which
292b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     represent section indices.  The first word is a flag word.  */
293b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Elf32_Word *scnidx = (Elf32_Word *) data->d_buf;
294b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  size_t cnt;
295b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  for (cnt = 1; cnt * sizeof (Elf32_Word) <= data->d_size; ++cnt)
296b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
297b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Elf_Scn *scn = elf_getscn (elf, scnidx[cnt]);
298b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (scn == NULL)
299b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	{
300b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  /* A section group refers to a non-existing section.  Should
301b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	     never happen.  */
302725aad5d2f8b78ed21a5e253fb38f9722c2c8b2dRoland McGrath	  __libdw_free_zdata (result);
30359254427e7c9eeb697de00069a9cb7dc1c908f86Mark Wielaard	  Dwarf_Sig8_Hash_free (&result->sig8_hash);
304b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  __libdw_seterrno (DWARF_E_INVALID_ELF);
305b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  free (result);
306b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  return NULL;
307b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	}
308b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
309c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper      result = check_section (result, ehdr, scn, true);
310c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper      if (result == NULL)
311c07fbb3ff74a8c7b4916ff8155060a35f4b08aaaUlrich Drepper	break;
312b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
313b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
314b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  return valid_p (result);
315b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper}
316b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
317b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
318b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperDwarf *
319b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperdwarf_begin_elf (elf, cmd, scngrp)
320b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     Elf *elf;
321b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     Dwarf_Cmd cmd;
322b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     Elf_Scn *scngrp;
323b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
324b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  GElf_Ehdr *ehdr;
325b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  GElf_Ehdr ehdr_mem;
326b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
327b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Get the ELF header of the file.  We need various pieces of
328b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     information from it.  */
329b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  ehdr = gelf_getehdr (elf, &ehdr_mem);
330b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (ehdr == NULL)
331b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
332b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (elf_kind (elf) != ELF_K_ELF)
333b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	__libdw_seterrno (DWARF_E_NOELF);
334b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else
335b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	__libdw_seterrno (DWARF_E_GETEHDR_ERROR);
336b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
337b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      return NULL;
338b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
339b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
340b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
341b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Default memory allocation size.  */
342b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  size_t mem_default_size = sysconf (_SC_PAGESIZE) - 4 * sizeof (void *);
343b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
344b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Allocate the data structure.  */
345b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwarf *result = (Dwarf *) calloc (1, sizeof (Dwarf) + mem_default_size);
3463e0f7d1d1b817040cef82f41879f471ab59b663eRoland McGrath  if (unlikely (result == NULL)
3473e0f7d1d1b817040cef82f41879f471ab59b663eRoland McGrath      || unlikely (Dwarf_Sig8_Hash_init (&result->sig8_hash, 11) < 0))
348b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
3493e0f7d1d1b817040cef82f41879f471ab59b663eRoland McGrath      free (result);
350b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      __libdw_seterrno (DWARF_E_NOMEM);
351b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      return NULL;
352b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
353b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
354b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Fill in some values.  */
355b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if ((BYTE_ORDER == LITTLE_ENDIAN && ehdr->e_ident[EI_DATA] == ELFDATA2MSB)
356b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      || (BYTE_ORDER == BIG_ENDIAN && ehdr->e_ident[EI_DATA] == ELFDATA2LSB))
357b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    result->other_byte_order = true;
358b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
359b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  result->elf = elf;
360b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
361b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Initialize the memory handling.  */
362b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  result->mem_default_size = mem_default_size;
363b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  result->oom_handler = __libdw_oom;
364b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  result->mem_tail = (struct libdw_memblock *) (result + 1);
365b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  result->mem_tail->size = (result->mem_default_size
366b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper			    - offsetof (struct libdw_memblock, mem));
367b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  result->mem_tail->remaining = result->mem_tail->size;
368b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  result->mem_tail->prev = NULL;
369b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
370b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (cmd == DWARF_C_READ || cmd == DWARF_C_RDWR)
371b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
372b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      /* If the caller provides a section group we get the DWARF
373b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	 sections only from this setion group.  Otherwise we search
374b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	 for the first section with the required name.  Further
375b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	 sections with the name are ignored.  The DWARF specification
376b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	 does not really say this is allowed.  */
377b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (scngrp == NULL)
378b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	return global_read (result, elf, ehdr);
379b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else
380b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	return scngrp_read (result, elf, ehdr, scngrp);
381b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
382b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  else if (cmd == DWARF_C_WRITE)
383b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
38459254427e7c9eeb697de00069a9cb7dc1c908f86Mark Wielaard      Dwarf_Sig8_Hash_free (&result->sig8_hash);
385b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      __libdw_seterrno (DWARF_E_UNIMPL);
386b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      free (result);
387b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      return NULL;
388b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
389b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
39059254427e7c9eeb697de00069a9cb7dc1c908f86Mark Wielaard  Dwarf_Sig8_Hash_free (&result->sig8_hash);
391b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  __libdw_seterrno (DWARF_E_INVALID_CMD);
392b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  free (result);
393b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  return NULL;
394b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper}
395b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDEF(dwarf_begin_elf)
396