1 /* Create descriptor from ELF descriptor for processing file. 2 Copyright (C) 2002-2011, 2014, 2015, 2017, 2018 Red Hat, Inc. 3 This file is part of elfutils. 4 5 This file is free software; you can redistribute it and/or modify 6 it under the terms of either 7 8 * the GNU Lesser General Public License as published by the Free 9 Software Foundation; either version 3 of the License, or (at 10 your option) any later version 11 12 or 13 14 * the GNU General Public License as published by the Free 15 Software Foundation; either version 2 of the License, or (at 16 your option) any later version 17 18 or both in parallel, as here. 19 20 elfutils is distributed in the hope that it will be useful, but 21 WITHOUT ANY WARRANTY; without even the implied warranty of 22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 23 General Public License for more details. 24 25 You should have received copies of the GNU General Public License and 26 the GNU Lesser General Public License along with this program. If 27 not, see <http://www.gnu.org/licenses/>. */ 28 29 #ifdef HAVE_CONFIG_H 30 # include <config.h> 31 #endif 32 33 #include <assert.h> 34 #include <stdbool.h> 35 #include <stddef.h> 36 #include <stdlib.h> 37 #include <stdio.h> 38 #include <string.h> 39 #include <unistd.h> 40 #include <sys/types.h> 41 #include <sys/stat.h> 42 #include <fcntl.h> 43 #include <endian.h> 44 45 #include "libelfP.h" 46 #include "libdwP.h" 47 48 49 /* Section names. (Note .debug_str_offsets is the largest 19 chars.) */ 50 static const char dwarf_scnnames[IDX_last][19] = 51 { 52 [IDX_debug_info] = ".debug_info", 53 [IDX_debug_types] = ".debug_types", 54 [IDX_debug_abbrev] = ".debug_abbrev", 55 [IDX_debug_addr] = ".debug_addr", 56 [IDX_debug_aranges] = ".debug_aranges", 57 [IDX_debug_line] = ".debug_line", 58 [IDX_debug_line_str] = ".debug_line_str", 59 [IDX_debug_frame] = ".debug_frame", 60 [IDX_debug_loc] = ".debug_loc", 61 [IDX_debug_loclists] = ".debug_loclists", 62 [IDX_debug_pubnames] = ".debug_pubnames", 63 [IDX_debug_str] = ".debug_str", 64 [IDX_debug_str_offsets] = ".debug_str_offsets", 65 [IDX_debug_macinfo] = ".debug_macinfo", 66 [IDX_debug_macro] = ".debug_macro", 67 [IDX_debug_ranges] = ".debug_ranges", 68 [IDX_debug_rnglists] = ".debug_rnglists", 69 [IDX_gnu_debugaltlink] = ".gnu_debugaltlink" 70 }; 71 #define ndwarf_scnnames (sizeof (dwarf_scnnames) / sizeof (dwarf_scnnames[0])) 72 73 static Dwarf * 74 check_section (Dwarf *result, size_t shstrndx, Elf_Scn *scn, bool inscngrp) 75 { 76 GElf_Shdr shdr_mem; 77 GElf_Shdr *shdr; 78 79 /* Get the section header data. */ 80 shdr = gelf_getshdr (scn, &shdr_mem); 81 if (shdr == NULL) 82 /* We may read /proc/PID/mem with only program headers mapped and section 83 headers out of the mapped pages. */ 84 goto err; 85 86 /* Ignore any SHT_NOBITS sections. Debugging sections should not 87 have been stripped, but in case of a corrupt file we won't try 88 to look at the missing data. */ 89 if (unlikely (shdr->sh_type == SHT_NOBITS)) 90 return result; 91 92 /* Make sure the section is part of a section group only iff we 93 really need it. If we are looking for the global (= non-section 94 group debug info) we have to ignore all the info in section 95 groups. If we are looking into a section group we cannot look at 96 a section which isn't part of the section group. */ 97 if (! inscngrp && (shdr->sh_flags & SHF_GROUP) != 0) 98 /* Ignore the section. */ 99 return result; 100 101 102 /* We recognize the DWARF section by their names. This is not very 103 safe and stable but the best we can do. */ 104 const char *scnname = elf_strptr (result->elf, shstrndx, 105 shdr->sh_name); 106 if (scnname == NULL) 107 { 108 /* The section name must be valid. Otherwise is the ELF file 109 invalid. */ 110 err: 111 Dwarf_Sig8_Hash_free (&result->sig8_hash); 112 __libdw_seterrno (DWARF_E_INVALID_ELF); 113 free (result); 114 return NULL; 115 } 116 117 /* Recognize the various sections. Most names start with .debug_. */ 118 size_t cnt; 119 bool gnu_compressed = false; 120 for (cnt = 0; cnt < ndwarf_scnnames; ++cnt) 121 { 122 size_t dbglen = strlen (dwarf_scnnames[cnt]); 123 size_t scnlen = strlen (scnname); 124 if (strncmp (scnname, dwarf_scnnames[cnt], dbglen) == 0 125 && (dbglen == scnlen 126 || (scnlen == dbglen + 4 127 && strstr (scnname, ".dwo") == scnname + dbglen))) 128 break; 129 else if (scnname[0] == '.' && scnname[1] == 'z' 130 && (strncmp (&scnname[2], &dwarf_scnnames[cnt][1], 131 dbglen - 1) == 0 132 && (scnlen == dbglen + 1 133 || (scnlen == dbglen + 5 134 && strstr (scnname, 135 ".dwo") == scnname + dbglen + 1)))) 136 { 137 gnu_compressed = true; 138 break; 139 } 140 } 141 142 if (cnt >= ndwarf_scnnames) 143 /* Not a debug section; ignore it. */ 144 return result; 145 146 if (unlikely (result->sectiondata[cnt] != NULL)) 147 /* A section appears twice. That's bad. We ignore the section. */ 148 return result; 149 150 /* We cannot know whether or not a GNU compressed section has already 151 been uncompressed or not, so ignore any errors. */ 152 if (gnu_compressed) 153 elf_compress_gnu (scn, 0, 0); 154 155 if ((shdr->sh_flags & SHF_COMPRESSED) != 0) 156 { 157 if (elf_compress (scn, 0, 0) < 0) 158 { 159 /* It would be nice if we could fail with a specific error. 160 But we don't know if this was an essential section or not. 161 So just continue for now. See also valid_p(). */ 162 return result; 163 } 164 } 165 166 /* Get the section data. */ 167 Elf_Data *data = elf_getdata (scn, NULL); 168 if (data == NULL) 169 goto err; 170 171 if (data->d_buf == NULL || data->d_size == 0) 172 /* No data actually available, ignore it. */ 173 return result; 174 175 /* We can now read the section data into results. */ 176 result->sectiondata[cnt] = data; 177 178 return result; 179 } 180 181 182 /* Helper function to set debugdir field. We want to cache the dir 183 where we found this Dwarf ELF file to locate alt and dwo files. */ 184 char * 185 __libdw_debugdir (int fd) 186 { 187 /* strlen ("/proc/self/fd/") = 14 + strlen (<MAXINT>) = 10 + 1 = 25. */ 188 char devfdpath[25]; 189 sprintf (devfdpath, "/proc/self/fd/%u", fd); 190 char *fdpath = realpath (devfdpath, NULL); 191 char *fddir; 192 if (fdpath != NULL && fdpath[0] == '/' 193 && (fddir = strrchr (fdpath, '/')) != NULL) 194 { 195 *++fddir = '\0'; 196 return fdpath; 197 } 198 return NULL; 199 } 200 201 202 /* Check whether all the necessary DWARF information is available. */ 203 static Dwarf * 204 valid_p (Dwarf *result) 205 { 206 /* We looked at all the sections. Now determine whether all the 207 sections with debugging information we need are there. 208 209 Require at least one section that can be read "standalone". */ 210 if (likely (result != NULL) 211 && unlikely (result->sectiondata[IDX_debug_info] == NULL 212 && result->sectiondata[IDX_debug_line] == NULL 213 && result->sectiondata[IDX_debug_frame] == NULL)) 214 { 215 Dwarf_Sig8_Hash_free (&result->sig8_hash); 216 __libdw_seterrno (DWARF_E_NO_DWARF); 217 free (result); 218 result = NULL; 219 } 220 221 /* For dwarf_location_attr () we need a "fake" CU to indicate 222 where the "fake" attribute data comes from. This is a block 223 inside the .debug_loc or .debug_loclists section. */ 224 if (result != NULL && result->sectiondata[IDX_debug_loc] != NULL) 225 { 226 result->fake_loc_cu = (Dwarf_CU *) calloc (1, sizeof (Dwarf_CU)); 227 if (unlikely (result->fake_loc_cu == NULL)) 228 { 229 Dwarf_Sig8_Hash_free (&result->sig8_hash); 230 __libdw_seterrno (DWARF_E_NOMEM); 231 free (result); 232 result = NULL; 233 } 234 else 235 { 236 result->fake_loc_cu->sec_idx = IDX_debug_loc; 237 result->fake_loc_cu->dbg = result; 238 result->fake_loc_cu->startp 239 = result->sectiondata[IDX_debug_loc]->d_buf; 240 result->fake_loc_cu->endp 241 = (result->sectiondata[IDX_debug_loc]->d_buf 242 + result->sectiondata[IDX_debug_loc]->d_size); 243 } 244 } 245 246 if (result != NULL && result->sectiondata[IDX_debug_loclists] != NULL) 247 { 248 result->fake_loclists_cu = (Dwarf_CU *) calloc (1, sizeof (Dwarf_CU)); 249 if (unlikely (result->fake_loclists_cu == NULL)) 250 { 251 Dwarf_Sig8_Hash_free (&result->sig8_hash); 252 __libdw_seterrno (DWARF_E_NOMEM); 253 free (result->fake_loc_cu); 254 free (result); 255 result = NULL; 256 } 257 else 258 { 259 result->fake_loclists_cu->sec_idx = IDX_debug_loclists; 260 result->fake_loclists_cu->dbg = result; 261 result->fake_loclists_cu->startp 262 = result->sectiondata[IDX_debug_loclists]->d_buf; 263 result->fake_loclists_cu->endp 264 = (result->sectiondata[IDX_debug_loclists]->d_buf 265 + result->sectiondata[IDX_debug_loclists]->d_size); 266 } 267 } 268 269 /* For DW_OP_constx/GNU_const_index and DW_OP_addrx/GNU_addr_index 270 the dwarf_location_attr () will need a "fake" address CU to 271 indicate where the attribute data comes from. This is a just 272 inside the .debug_addr section, if it exists. */ 273 if (result != NULL && result->sectiondata[IDX_debug_addr] != NULL) 274 { 275 result->fake_addr_cu = (Dwarf_CU *) calloc (1, sizeof (Dwarf_CU)); 276 if (unlikely (result->fake_addr_cu == NULL)) 277 { 278 Dwarf_Sig8_Hash_free (&result->sig8_hash); 279 __libdw_seterrno (DWARF_E_NOMEM); 280 free (result->fake_loc_cu); 281 free (result->fake_loclists_cu); 282 free (result); 283 result = NULL; 284 } 285 else 286 { 287 result->fake_addr_cu->sec_idx = IDX_debug_addr; 288 result->fake_addr_cu->dbg = result; 289 result->fake_addr_cu->startp 290 = result->sectiondata[IDX_debug_addr]->d_buf; 291 result->fake_addr_cu->endp 292 = (result->sectiondata[IDX_debug_addr]->d_buf 293 + result->sectiondata[IDX_debug_addr]->d_size); 294 } 295 } 296 297 if (result != NULL) 298 result->debugdir = __libdw_debugdir (result->elf->fildes); 299 300 return result; 301 } 302 303 304 static Dwarf * 305 global_read (Dwarf *result, Elf *elf, size_t shstrndx) 306 { 307 Elf_Scn *scn = NULL; 308 309 while (result != NULL && (scn = elf_nextscn (elf, scn)) != NULL) 310 result = check_section (result, shstrndx, scn, false); 311 312 return valid_p (result); 313 } 314 315 316 static Dwarf * 317 scngrp_read (Dwarf *result, Elf *elf, size_t shstrndx, Elf_Scn *scngrp) 318 { 319 GElf_Shdr shdr_mem; 320 GElf_Shdr *shdr = gelf_getshdr (scngrp, &shdr_mem); 321 if (shdr == NULL) 322 { 323 Dwarf_Sig8_Hash_free (&result->sig8_hash); 324 __libdw_seterrno (DWARF_E_INVALID_ELF); 325 free (result); 326 return NULL; 327 } 328 329 if ((shdr->sh_flags & SHF_COMPRESSED) != 0 330 && elf_compress (scngrp, 0, 0) < 0) 331 { 332 Dwarf_Sig8_Hash_free (&result->sig8_hash); 333 __libdw_seterrno (DWARF_E_COMPRESSED_ERROR); 334 free (result); 335 return NULL; 336 } 337 338 /* SCNGRP is the section descriptor for a section group which might 339 contain debug sections. */ 340 Elf_Data *data = elf_getdata (scngrp, NULL); 341 if (data == NULL) 342 { 343 /* We cannot read the section content. Fail! */ 344 Dwarf_Sig8_Hash_free (&result->sig8_hash); 345 free (result); 346 return NULL; 347 } 348 349 /* The content of the section is a number of 32-bit words which 350 represent section indices. The first word is a flag word. */ 351 Elf32_Word *scnidx = (Elf32_Word *) data->d_buf; 352 size_t cnt; 353 for (cnt = 1; cnt * sizeof (Elf32_Word) <= data->d_size; ++cnt) 354 { 355 Elf_Scn *scn = elf_getscn (elf, scnidx[cnt]); 356 if (scn == NULL) 357 { 358 /* A section group refers to a non-existing section. Should 359 never happen. */ 360 Dwarf_Sig8_Hash_free (&result->sig8_hash); 361 __libdw_seterrno (DWARF_E_INVALID_ELF); 362 free (result); 363 return NULL; 364 } 365 366 result = check_section (result, shstrndx, scn, true); 367 if (result == NULL) 368 break; 369 } 370 371 return valid_p (result); 372 } 373 374 375 Dwarf * 376 dwarf_begin_elf (Elf *elf, Dwarf_Cmd cmd, Elf_Scn *scngrp) 377 { 378 GElf_Ehdr *ehdr; 379 GElf_Ehdr ehdr_mem; 380 381 /* Get the ELF header of the file. We need various pieces of 382 information from it. */ 383 ehdr = gelf_getehdr (elf, &ehdr_mem); 384 if (ehdr == NULL) 385 { 386 if (elf_kind (elf) != ELF_K_ELF) 387 __libdw_seterrno (DWARF_E_NOELF); 388 else 389 __libdw_seterrno (DWARF_E_GETEHDR_ERROR); 390 391 return NULL; 392 } 393 394 395 /* Default memory allocation size. */ 396 size_t mem_default_size = sysconf (_SC_PAGESIZE) - 4 * sizeof (void *); 397 assert (sizeof (struct Dwarf) < mem_default_size); 398 399 /* Allocate the data structure. */ 400 Dwarf *result = (Dwarf *) calloc (1, sizeof (Dwarf) + mem_default_size); 401 if (unlikely (result == NULL) 402 || unlikely (Dwarf_Sig8_Hash_init (&result->sig8_hash, 11) < 0)) 403 { 404 free (result); 405 __libdw_seterrno (DWARF_E_NOMEM); 406 return NULL; 407 } 408 409 /* Fill in some values. */ 410 if ((BYTE_ORDER == LITTLE_ENDIAN && ehdr->e_ident[EI_DATA] == ELFDATA2MSB) 411 || (BYTE_ORDER == BIG_ENDIAN && ehdr->e_ident[EI_DATA] == ELFDATA2LSB)) 412 result->other_byte_order = true; 413 414 result->elf = elf; 415 result->alt_fd = -1; 416 417 /* Initialize the memory handling. */ 418 result->mem_default_size = mem_default_size; 419 result->oom_handler = __libdw_oom; 420 result->mem_tail = (struct libdw_memblock *) (result + 1); 421 result->mem_tail->size = (result->mem_default_size 422 - offsetof (struct libdw_memblock, mem)); 423 result->mem_tail->remaining = result->mem_tail->size; 424 result->mem_tail->prev = NULL; 425 426 if (cmd == DWARF_C_READ || cmd == DWARF_C_RDWR) 427 { 428 /* All sections are recognized by name, so pass the section header 429 string index along to easily get the section names. */ 430 size_t shstrndx; 431 if (elf_getshdrstrndx (elf, &shstrndx) != 0) 432 { 433 Dwarf_Sig8_Hash_free (&result->sig8_hash); 434 __libdw_seterrno (DWARF_E_INVALID_ELF); 435 free (result); 436 return NULL; 437 } 438 439 /* If the caller provides a section group we get the DWARF 440 sections only from this setion group. Otherwise we search 441 for the first section with the required name. Further 442 sections with the name are ignored. The DWARF specification 443 does not really say this is allowed. */ 444 if (scngrp == NULL) 445 return global_read (result, elf, shstrndx); 446 else 447 return scngrp_read (result, elf, shstrndx, scngrp); 448 } 449 else if (cmd == DWARF_C_WRITE) 450 { 451 Dwarf_Sig8_Hash_free (&result->sig8_hash); 452 __libdw_seterrno (DWARF_E_UNIMPL); 453 free (result); 454 return NULL; 455 } 456 457 Dwarf_Sig8_Hash_free (&result->sig8_hash); 458 __libdw_seterrno (DWARF_E_INVALID_CMD); 459 free (result); 460 return NULL; 461 } 462 INTDEF(dwarf_begin_elf) 463