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