1 /* elf.c -- Get debug data from an ELF file for backtraces.
2 Copyright (C) 2012-2016 Free Software Foundation, Inc.
3 Written by Ian Lance Taylor, Google.
4
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are
7 met:
8
9 (1) Redistributions of source code must retain the above copyright
10 notice, this list of conditions and the following disclaimer.
11
12 (2) Redistributions in binary form must reproduce the above copyright
13 notice, this list of conditions and the following disclaimer in
14 the documentation and/or other materials provided with the
15 distribution.
16
17 (3) The name of the author may not be used to
18 endorse or promote products derived from this software without
19 specific prior written permission.
20
21 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
25 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29 STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
30 IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 POSSIBILITY OF SUCH DAMAGE. */
32
33 #include "config.h"
34
35 #include <stdlib.h>
36 #include <string.h>
37 #include <sys/types.h>
38
39 #ifdef HAVE_DL_ITERATE_PHDR
40 #include <link.h>
41 #endif
42
43 #include "backtrace.h"
44 #include "internal.h"
45
46 /* ELF-specific state. */
47
48 struct elf_state
49 {
50 /* The "view" of the strtab section. */
51 struct backtrace_view strtab_view;
52
53 /* Non-zero if valid. */
54 int strtab_view_valid;
55
56 /* The "view" of the debug sections.
57 All debug sections are loaded into one view since they're generally
58 contiguous in the file. */
59 struct backtrace_view debug_view;
60
61 /* Non-zero if valid. */
62 int debug_view_valid;
63 };
64
65 #ifndef HAVE_DL_ITERATE_PHDR
66
67 /* Dummy version of dl_iterate_phdr for systems that don't have it. */
68
69 #define dl_phdr_info x_dl_phdr_info
70 #define dl_iterate_phdr x_dl_iterate_phdr
71
72 struct dl_phdr_info
73 {
74 uintptr_t dlpi_addr;
75 const char *dlpi_name;
76 };
77
78 static int
dl_iterate_phdr(int (* callback)(struct dl_phdr_info *,size_t,void *)ATTRIBUTE_UNUSED,void * data ATTRIBUTE_UNUSED)79 dl_iterate_phdr (int (*callback) (struct dl_phdr_info *,
80 size_t, void *) ATTRIBUTE_UNUSED,
81 void *data ATTRIBUTE_UNUSED)
82 {
83 return 0;
84 }
85
86 #endif /* ! defined (HAVE_DL_ITERATE_PHDR) */
87
88 /* The configure script must tell us whether we are 32-bit or 64-bit
89 ELF. We could make this code test and support either possibility,
90 but there is no point. This code only works for the currently
91 running executable, which means that we know the ELF mode at
92 configure mode. */
93
94 #if BACKTRACE_ELF_SIZE != 32 && BACKTRACE_ELF_SIZE != 64
95 #error "Unknown BACKTRACE_ELF_SIZE"
96 #endif
97
98 /* <link.h> might #include <elf.h> which might define our constants
99 with slightly different values. Undefine them to be safe. */
100
101 #undef EI_NIDENT
102 #undef EI_MAG0
103 #undef EI_MAG1
104 #undef EI_MAG2
105 #undef EI_MAG3
106 #undef EI_CLASS
107 #undef EI_DATA
108 #undef EI_VERSION
109 #undef ELF_MAG0
110 #undef ELF_MAG1
111 #undef ELF_MAG2
112 #undef ELF_MAG3
113 #undef ELFCLASS32
114 #undef ELFCLASS64
115 #undef ELFDATA2LSB
116 #undef ELFDATA2MSB
117 #undef EV_CURRENT
118 #undef ET_DYN
119 #undef SHN_LORESERVE
120 #undef SHN_XINDEX
121 #undef SHN_UNDEF
122 #undef SHT_SYMTAB
123 #undef SHT_STRTAB
124 #undef SHT_DYNSYM
125 #undef STT_OBJECT
126 #undef STT_FUNC
127
128 /* Basic types. */
129
130 typedef uint16_t b_elf_half; /* Elf_Half. */
131 typedef uint32_t b_elf_word; /* Elf_Word. */
132 typedef int32_t b_elf_sword; /* Elf_Sword. */
133
134 #if BACKTRACE_ELF_SIZE == 32
135
136 typedef uint32_t b_elf_addr; /* Elf_Addr. */
137 typedef uint32_t b_elf_off; /* Elf_Off. */
138
139 typedef uint32_t b_elf_wxword; /* 32-bit Elf_Word, 64-bit ELF_Xword. */
140
141 #else
142
143 typedef uint64_t b_elf_addr; /* Elf_Addr. */
144 typedef uint64_t b_elf_off; /* Elf_Off. */
145 typedef uint64_t b_elf_xword; /* Elf_Xword. */
146 typedef int64_t b_elf_sxword; /* Elf_Sxword. */
147
148 typedef uint64_t b_elf_wxword; /* 32-bit Elf_Word, 64-bit ELF_Xword. */
149
150 #endif
151
152 /* Data structures and associated constants. */
153
154 #define EI_NIDENT 16
155
156 typedef struct {
157 unsigned char e_ident[EI_NIDENT]; /* ELF "magic number" */
158 b_elf_half e_type; /* Identifies object file type */
159 b_elf_half e_machine; /* Specifies required architecture */
160 b_elf_word e_version; /* Identifies object file version */
161 b_elf_addr e_entry; /* Entry point virtual address */
162 b_elf_off e_phoff; /* Program header table file offset */
163 b_elf_off e_shoff; /* Section header table file offset */
164 b_elf_word e_flags; /* Processor-specific flags */
165 b_elf_half e_ehsize; /* ELF header size in bytes */
166 b_elf_half e_phentsize; /* Program header table entry size */
167 b_elf_half e_phnum; /* Program header table entry count */
168 b_elf_half e_shentsize; /* Section header table entry size */
169 b_elf_half e_shnum; /* Section header table entry count */
170 b_elf_half e_shstrndx; /* Section header string table index */
171 } b_elf_ehdr; /* Elf_Ehdr. */
172
173 #define EI_MAG0 0
174 #define EI_MAG1 1
175 #define EI_MAG2 2
176 #define EI_MAG3 3
177 #define EI_CLASS 4
178 #define EI_DATA 5
179 #define EI_VERSION 6
180
181 #define ELFMAG0 0x7f
182 #define ELFMAG1 'E'
183 #define ELFMAG2 'L'
184 #define ELFMAG3 'F'
185
186 #define ELFCLASS32 1
187 #define ELFCLASS64 2
188
189 #define ELFDATA2LSB 1
190 #define ELFDATA2MSB 2
191
192 #define EV_CURRENT 1
193
194 #define ET_DYN 3
195
196 typedef struct {
197 b_elf_word sh_name; /* Section name, index in string tbl */
198 b_elf_word sh_type; /* Type of section */
199 b_elf_wxword sh_flags; /* Miscellaneous section attributes */
200 b_elf_addr sh_addr; /* Section virtual addr at execution */
201 b_elf_off sh_offset; /* Section file offset */
202 b_elf_wxword sh_size; /* Size of section in bytes */
203 b_elf_word sh_link; /* Index of another section */
204 b_elf_word sh_info; /* Additional section information */
205 b_elf_wxword sh_addralign; /* Section alignment */
206 b_elf_wxword sh_entsize; /* Entry size if section holds table */
207 } b_elf_shdr; /* Elf_Shdr. */
208
209 #define SHN_UNDEF 0x0000 /* Undefined section */
210 #define SHN_LORESERVE 0xFF00 /* Begin range of reserved indices */
211 #define SHN_XINDEX 0xFFFF /* Section index is held elsewhere */
212
213 #define SHT_SYMTAB 2
214 #define SHT_STRTAB 3
215 #define SHT_DYNSYM 11
216
217 #if BACKTRACE_ELF_SIZE == 32
218
219 typedef struct
220 {
221 b_elf_word st_name; /* Symbol name, index in string tbl */
222 b_elf_addr st_value; /* Symbol value */
223 b_elf_word st_size; /* Symbol size */
224 unsigned char st_info; /* Symbol binding and type */
225 unsigned char st_other; /* Visibility and other data */
226 b_elf_half st_shndx; /* Symbol section index */
227 } b_elf_sym; /* Elf_Sym. */
228
229 #else /* BACKTRACE_ELF_SIZE != 32 */
230
231 typedef struct
232 {
233 b_elf_word st_name; /* Symbol name, index in string tbl */
234 unsigned char st_info; /* Symbol binding and type */
235 unsigned char st_other; /* Visibility and other data */
236 b_elf_half st_shndx; /* Symbol section index */
237 b_elf_addr st_value; /* Symbol value */
238 b_elf_xword st_size; /* Symbol size */
239 } b_elf_sym; /* Elf_Sym. */
240
241 #endif /* BACKTRACE_ELF_SIZE != 32 */
242
243 #define STT_OBJECT 1
244 #define STT_FUNC 2
245
246 /* An index of ELF sections we care about. */
247
248 enum debug_section
249 {
250 DEBUG_INFO,
251 DEBUG_LINE,
252 DEBUG_ABBREV,
253 DEBUG_RANGES,
254 DEBUG_STR,
255 DEBUG_MAX
256 };
257
258 /* Names of sections, indexed by enum elf_section. */
259
260 static const char * const debug_section_names[DEBUG_MAX] =
261 {
262 ".debug_info",
263 ".debug_line",
264 ".debug_abbrev",
265 ".debug_ranges",
266 ".debug_str"
267 };
268
269 /* Information we gather for the sections we care about. */
270
271 struct debug_section_info
272 {
273 /* Section file offset. */
274 off_t offset;
275 /* Section size. */
276 size_t size;
277 /* Section contents, after read from file. */
278 const unsigned char *data;
279 };
280
281 /* Information we keep for an ELF symbol. */
282
283 struct elf_symbol
284 {
285 /* The name of the symbol. */
286 const char *name;
287 /* The address of the symbol. */
288 uintptr_t address;
289 /* The size of the symbol. */
290 size_t size;
291 };
292
293 /* Information to pass to elf_syminfo. */
294
295 struct elf_syminfo_data
296 {
297 /* Symbols for the next module. */
298 struct elf_syminfo_data *next;
299 /* The ELF symbols, sorted by address. */
300 struct elf_symbol *symbols;
301 /* The number of symbols. */
302 size_t count;
303 };
304
305 /* A dummy callback function used when we can't find any debug info. */
306
307 static int
elf_nodebug(struct backtrace_state * state ATTRIBUTE_UNUSED,uintptr_t pc ATTRIBUTE_UNUSED,backtrace_full_callback callback ATTRIBUTE_UNUSED,backtrace_error_callback error_callback,void * data)308 elf_nodebug (struct backtrace_state *state ATTRIBUTE_UNUSED,
309 uintptr_t pc ATTRIBUTE_UNUSED,
310 backtrace_full_callback callback ATTRIBUTE_UNUSED,
311 backtrace_error_callback error_callback, void *data)
312 {
313 error_callback (data, "no debug info in ELF executable", -1);
314 return 0;
315 }
316
317 /* A dummy callback function used when we can't find a symbol
318 table. */
319
320 static void
elf_nosyms(struct backtrace_state * state ATTRIBUTE_UNUSED,uintptr_t addr ATTRIBUTE_UNUSED,backtrace_syminfo_callback callback ATTRIBUTE_UNUSED,backtrace_error_callback error_callback,void * data)321 elf_nosyms (struct backtrace_state *state ATTRIBUTE_UNUSED,
322 uintptr_t addr ATTRIBUTE_UNUSED,
323 backtrace_syminfo_callback callback ATTRIBUTE_UNUSED,
324 backtrace_error_callback error_callback, void *data)
325 {
326 error_callback (data, "no symbol table in ELF executable", -1);
327 }
328
329 /* Compare struct elf_symbol for qsort. */
330
331 static int
elf_symbol_compare(const void * v1,const void * v2)332 elf_symbol_compare (const void *v1, const void *v2)
333 {
334 const struct elf_symbol *e1 = (const struct elf_symbol *) v1;
335 const struct elf_symbol *e2 = (const struct elf_symbol *) v2;
336
337 if (e1->address < e2->address)
338 return -1;
339 else if (e1->address > e2->address)
340 return 1;
341 else
342 return 0;
343 }
344
345 /* Compare an ADDR against an elf_symbol for bsearch. We allocate one
346 extra entry in the array so that this can look safely at the next
347 entry. */
348
349 static int
elf_symbol_search(const void * vkey,const void * ventry)350 elf_symbol_search (const void *vkey, const void *ventry)
351 {
352 const uintptr_t *key = (const uintptr_t *) vkey;
353 const struct elf_symbol *entry = (const struct elf_symbol *) ventry;
354 uintptr_t addr;
355
356 addr = *key;
357 if (addr < entry->address)
358 return -1;
359 else if (addr >= entry->address + entry->size)
360 return 1;
361 else
362 return 0;
363 }
364
365 /* Initialize the symbol table info for elf_syminfo. */
366
367 static int
elf_initialize_syminfo(struct backtrace_state * state,uintptr_t base_address,const unsigned char * symtab_data,size_t symtab_size,const unsigned char * strtab,size_t strtab_size,backtrace_error_callback error_callback,void * data,struct elf_syminfo_data * sdata)368 elf_initialize_syminfo (struct backtrace_state *state,
369 uintptr_t base_address,
370 const unsigned char *symtab_data, size_t symtab_size,
371 const unsigned char *strtab, size_t strtab_size,
372 backtrace_error_callback error_callback,
373 void *data, struct elf_syminfo_data *sdata)
374 {
375 size_t sym_count;
376 const b_elf_sym *sym;
377 size_t elf_symbol_count;
378 size_t elf_symbol_size;
379 struct elf_symbol *elf_symbols;
380 size_t i;
381 unsigned int j;
382
383 sym_count = symtab_size / sizeof (b_elf_sym);
384
385 /* We only care about function symbols. Count them. */
386 sym = (const b_elf_sym *) symtab_data;
387 elf_symbol_count = 0;
388 for (i = 0; i < sym_count; ++i, ++sym)
389 {
390 int info;
391
392 info = sym->st_info & 0xf;
393 if ((info == STT_FUNC || info == STT_OBJECT)
394 && sym->st_shndx != SHN_UNDEF)
395 ++elf_symbol_count;
396 }
397
398 elf_symbol_size = elf_symbol_count * sizeof (struct elf_symbol);
399 elf_symbols = ((struct elf_symbol *)
400 backtrace_alloc (state, elf_symbol_size, error_callback,
401 data));
402 if (elf_symbols == NULL)
403 return 0;
404
405 sym = (const b_elf_sym *) symtab_data;
406 j = 0;
407 for (i = 0; i < sym_count; ++i, ++sym)
408 {
409 int info;
410
411 info = sym->st_info & 0xf;
412 if (info != STT_FUNC && info != STT_OBJECT)
413 continue;
414 if (sym->st_shndx == SHN_UNDEF)
415 continue;
416 if (sym->st_name >= strtab_size)
417 {
418 error_callback (data, "symbol string index out of range", 0);
419 backtrace_free (state, elf_symbols, elf_symbol_size, error_callback,
420 data);
421 return 0;
422 }
423 elf_symbols[j].name = (const char *) strtab + sym->st_name;
424 elf_symbols[j].address = sym->st_value + base_address;
425 elf_symbols[j].size = sym->st_size;
426 ++j;
427 }
428
429 backtrace_qsort (elf_symbols, elf_symbol_count, sizeof (struct elf_symbol),
430 elf_symbol_compare);
431
432 sdata->next = NULL;
433 sdata->symbols = elf_symbols;
434 sdata->count = elf_symbol_count;
435
436 return 1;
437 }
438
439 /* Add EDATA to the list in STATE. */
440
441 static void
elf_add_syminfo_data(struct backtrace_state * state,struct elf_syminfo_data * edata)442 elf_add_syminfo_data (struct backtrace_state *state,
443 struct elf_syminfo_data *edata)
444 {
445 if (!state->threaded)
446 {
447 struct elf_syminfo_data **pp;
448
449 for (pp = (struct elf_syminfo_data **) (void *) &state->syminfo_data;
450 *pp != NULL;
451 pp = &(*pp)->next)
452 ;
453 *pp = edata;
454 }
455 else
456 {
457 while (1)
458 {
459 struct elf_syminfo_data **pp;
460
461 pp = (struct elf_syminfo_data **) (void *) &state->syminfo_data;
462
463 while (1)
464 {
465 struct elf_syminfo_data *p;
466
467 p = backtrace_atomic_load_pointer (pp);
468
469 if (p == NULL)
470 break;
471
472 pp = &p->next;
473 }
474
475 if (__sync_bool_compare_and_swap (pp, NULL, edata))
476 break;
477 }
478 }
479 }
480
481 /* Return the symbol name and value for an ADDR. */
482
483 static void
elf_syminfo(struct backtrace_state * state,uintptr_t addr,backtrace_syminfo_callback callback,backtrace_error_callback error_callback ATTRIBUTE_UNUSED,void * data)484 elf_syminfo (struct backtrace_state *state, uintptr_t addr,
485 backtrace_syminfo_callback callback,
486 backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
487 void *data)
488 {
489 struct elf_syminfo_data *edata;
490 struct elf_symbol *sym = NULL;
491
492 if (!state->threaded)
493 {
494 for (edata = (struct elf_syminfo_data *) state->syminfo_data;
495 edata != NULL;
496 edata = edata->next)
497 {
498 sym = ((struct elf_symbol *)
499 bsearch (&addr, edata->symbols, edata->count,
500 sizeof (struct elf_symbol), elf_symbol_search));
501 if (sym != NULL)
502 break;
503 }
504 }
505 else
506 {
507 struct elf_syminfo_data **pp;
508
509 pp = (struct elf_syminfo_data **) (void *) &state->syminfo_data;
510 while (1)
511 {
512 edata = backtrace_atomic_load_pointer (pp);
513 if (edata == NULL)
514 break;
515
516 sym = ((struct elf_symbol *)
517 bsearch (&addr, edata->symbols, edata->count,
518 sizeof (struct elf_symbol), elf_symbol_search));
519 if (sym != NULL)
520 break;
521
522 pp = &edata->next;
523 }
524 }
525
526 if (sym == NULL)
527 callback (data, addr, NULL, 0, 0);
528 else
529 callback (data, addr, sym->name, sym->address, sym->size);
530 }
531
532 /* Add the backtrace data for one ELF file. Returns 1 on success,
533 0 on failure (in both cases descriptor is closed) or -1 if exe
534 is non-zero and the ELF file is ET_DYN and !BASE_ADDRESS_SET,
535 which tells the caller that elf_add will need to be called on the
536 descriptor again after base_address is determined. */
537
538 static int
elf_add(struct backtrace_state * state,int descriptor,uintptr_t base_address,int base_address_set,backtrace_error_callback error_callback,void * data,fileline * fileline_fn,int * found_sym,int * found_dwarf,int exe)539 elf_add (struct backtrace_state *state, int descriptor,
540 uintptr_t base_address, int base_address_set,
541 backtrace_error_callback error_callback, void *data,
542 fileline *fileline_fn, int *found_sym, int *found_dwarf, int exe)
543 {
544 struct elf_state *elf_state = state->target_state;
545 struct backtrace_view ehdr_view;
546 b_elf_ehdr ehdr;
547 off_t shoff;
548 unsigned int shnum;
549 unsigned int shstrndx;
550 struct backtrace_view shdrs_view;
551 int shdrs_view_valid;
552 const b_elf_shdr *shdrs;
553 const b_elf_shdr *shstrhdr;
554 size_t shstr_size;
555 off_t shstr_off;
556 struct backtrace_view names_view;
557 int names_view_valid;
558 const char *names;
559 unsigned int symtab_shndx;
560 unsigned int dynsym_shndx;
561 unsigned int i;
562 struct debug_section_info sections[DEBUG_MAX];
563 struct backtrace_view symtab_view;
564 int symtab_view_valid;
565 struct backtrace_view strtab_view;
566 int strtab_view_valid;
567 off_t min_offset;
568 off_t max_offset;
569 struct backtrace_view debug_view;
570 int debug_view_valid;
571
572 *found_sym = 0;
573 *found_dwarf = 0;
574
575 shdrs_view_valid = 0;
576 names_view_valid = 0;
577 symtab_view_valid = 0;
578 strtab_view_valid = 0;
579 debug_view_valid = 0;
580
581 if (!backtrace_get_view (state, descriptor, 0, sizeof ehdr, error_callback,
582 data, &ehdr_view))
583 goto fail;
584
585 memcpy (&ehdr, ehdr_view.data, sizeof ehdr);
586
587 backtrace_release_view (state, &ehdr_view, error_callback, data);
588
589 if (ehdr.e_ident[EI_MAG0] != ELFMAG0
590 || ehdr.e_ident[EI_MAG1] != ELFMAG1
591 || ehdr.e_ident[EI_MAG2] != ELFMAG2
592 || ehdr.e_ident[EI_MAG3] != ELFMAG3)
593 {
594 error_callback (data, "executable file is not ELF", 0);
595 goto fail;
596 }
597 if (ehdr.e_ident[EI_VERSION] != EV_CURRENT)
598 {
599 error_callback (data, "executable file is unrecognized ELF version", 0);
600 goto fail;
601 }
602
603 #if BACKTRACE_ELF_SIZE == 32
604 #define BACKTRACE_ELFCLASS ELFCLASS32
605 #else
606 #define BACKTRACE_ELFCLASS ELFCLASS64
607 #endif
608
609 if (ehdr.e_ident[EI_CLASS] != BACKTRACE_ELFCLASS)
610 {
611 error_callback (data, "executable file is unexpected ELF class", 0);
612 goto fail;
613 }
614
615 if (ehdr.e_ident[EI_DATA] != ELFDATA2LSB
616 && ehdr.e_ident[EI_DATA] != ELFDATA2MSB)
617 {
618 error_callback (data, "executable file has unknown endianness", 0);
619 goto fail;
620 }
621
622 /* If the executable is ET_DYN, it is either a PIE, or we are running
623 directly a shared library with .interp. If we don't know the base
624 address yet then we need to wait for dl_iterate_phdr (or equivalent)
625 to determine the actual base_address. */
626 if (exe && ehdr.e_type == ET_DYN && !base_address_set)
627 return -1;
628
629 shoff = ehdr.e_shoff;
630 shnum = ehdr.e_shnum;
631 shstrndx = ehdr.e_shstrndx;
632
633 if ((shnum == 0 || shstrndx == SHN_XINDEX)
634 && shoff != 0)
635 {
636 struct backtrace_view shdr_view;
637 const b_elf_shdr *shdr;
638
639 if (!backtrace_get_view (state, descriptor, shoff, sizeof shdr,
640 error_callback, data, &shdr_view))
641 goto fail;
642
643 shdr = (const b_elf_shdr *) shdr_view.data;
644
645 if (shnum == 0)
646 shnum = shdr->sh_size;
647
648 if (shstrndx == SHN_XINDEX)
649 {
650 shstrndx = shdr->sh_link;
651
652 /* Versions of the GNU binutils between 2.12 and 2.18 did
653 not handle objects with more than SHN_LORESERVE sections
654 correctly. All large section indexes were offset by
655 0x100. There is more information at
656 http://sourceware.org/bugzilla/show_bug.cgi?id-5900 .
657 Fortunately these object files are easy to detect, as the
658 GNU binutils always put the section header string table
659 near the end of the list of sections. Thus if the
660 section header string table index is larger than the
661 number of sections, then we know we have to subtract
662 0x100 to get the real section index. */
663 if (shstrndx >= shnum && shstrndx >= SHN_LORESERVE + 0x100)
664 shstrndx -= 0x100;
665 }
666
667 backtrace_release_view (state, &shdr_view, error_callback, data);
668 }
669
670 /* To translate PC to file/line when using DWARF, we need to find
671 the .debug_info and .debug_line sections. */
672
673 /* Read the section headers, skipping the first one. */
674
675 if (!backtrace_get_view (state, descriptor, shoff + sizeof (b_elf_shdr),
676 (shnum - 1) * sizeof (b_elf_shdr),
677 error_callback, data, &shdrs_view))
678 goto fail;
679 shdrs_view_valid = 1;
680 shdrs = (const b_elf_shdr *) shdrs_view.data;
681
682 /* Read the section names. */
683
684 shstrhdr = &shdrs[shstrndx - 1];
685 shstr_size = shstrhdr->sh_size;
686 shstr_off = shstrhdr->sh_offset;
687
688 if (!backtrace_get_view (state, descriptor, shstr_off, shstr_size,
689 error_callback, data, &names_view))
690 goto fail;
691 names_view_valid = 1;
692 names = (const char *) names_view.data;
693
694 symtab_shndx = 0;
695 dynsym_shndx = 0;
696
697 memset (sections, 0, sizeof sections);
698
699 /* Look for the symbol table. */
700 for (i = 1; i < shnum; ++i)
701 {
702 const b_elf_shdr *shdr;
703 unsigned int sh_name;
704 const char *name;
705 int j;
706
707 shdr = &shdrs[i - 1];
708
709 if (shdr->sh_type == SHT_SYMTAB)
710 symtab_shndx = i;
711 else if (shdr->sh_type == SHT_DYNSYM)
712 dynsym_shndx = i;
713
714 sh_name = shdr->sh_name;
715 if (sh_name >= shstr_size)
716 {
717 error_callback (data, "ELF section name out of range", 0);
718 goto fail;
719 }
720
721 name = names + sh_name;
722
723 for (j = 0; j < (int) DEBUG_MAX; ++j)
724 {
725 if (strcmp (name, debug_section_names[j]) == 0)
726 {
727 sections[j].offset = shdr->sh_offset;
728 sections[j].size = shdr->sh_size;
729 break;
730 }
731 }
732 }
733
734 if (symtab_shndx == 0)
735 symtab_shndx = dynsym_shndx;
736 if (symtab_shndx != 0)
737 {
738 const b_elf_shdr *symtab_shdr;
739 unsigned int strtab_shndx;
740 const b_elf_shdr *strtab_shdr;
741 struct elf_syminfo_data *sdata;
742
743 symtab_shdr = &shdrs[symtab_shndx - 1];
744 strtab_shndx = symtab_shdr->sh_link;
745 if (strtab_shndx >= shnum)
746 {
747 error_callback (data,
748 "ELF symbol table strtab link out of range", 0);
749 goto fail;
750 }
751 strtab_shdr = &shdrs[strtab_shndx - 1];
752
753 if (!backtrace_get_view (state, descriptor, symtab_shdr->sh_offset,
754 symtab_shdr->sh_size, error_callback, data,
755 &symtab_view))
756 goto fail;
757 symtab_view_valid = 1;
758
759 if (!backtrace_get_view (state, descriptor, strtab_shdr->sh_offset,
760 strtab_shdr->sh_size, error_callback, data,
761 &strtab_view))
762 goto fail;
763 strtab_view_valid = 1;
764
765 sdata = ((struct elf_syminfo_data *)
766 backtrace_alloc (state, sizeof *sdata, error_callback, data));
767 if (sdata == NULL)
768 goto fail;
769
770 if (!elf_initialize_syminfo (state, base_address,
771 symtab_view.data, symtab_shdr->sh_size,
772 strtab_view.data, strtab_shdr->sh_size,
773 error_callback, data, sdata))
774 {
775 backtrace_free (state, sdata, sizeof *sdata, error_callback, data);
776 goto fail;
777 }
778
779 /* We no longer need the symbol table, but we hold on to the
780 string table permanently. */
781 backtrace_release_view (state, &symtab_view, error_callback, data);
782
783 *found_sym = 1;
784
785 elf_add_syminfo_data (state, sdata);
786 }
787
788 /* FIXME: Need to handle compressed debug sections. */
789
790 backtrace_release_view (state, &shdrs_view, error_callback, data);
791 shdrs_view_valid = 0;
792 backtrace_release_view (state, &names_view, error_callback, data);
793 names_view_valid = 0;
794
795 /* Read all the debug sections in a single view, since they are
796 probably adjacent in the file. We never release this view. */
797
798 min_offset = 0;
799 max_offset = 0;
800 for (i = 0; i < (int) DEBUG_MAX; ++i)
801 {
802 off_t end;
803
804 if (sections[i].size == 0)
805 continue;
806 if (min_offset == 0 || sections[i].offset < min_offset)
807 min_offset = sections[i].offset;
808 end = sections[i].offset + sections[i].size;
809 if (end > max_offset)
810 max_offset = end;
811 }
812 if (min_offset == 0 || max_offset == 0)
813 {
814 if (!backtrace_close (descriptor, error_callback, data))
815 goto fail;
816 elf_state->strtab_view = strtab_view;
817 elf_state->strtab_view_valid = 1;
818 return 1;
819 }
820
821 if (!backtrace_get_view (state, descriptor, min_offset,
822 max_offset - min_offset,
823 error_callback, data, &debug_view))
824 goto fail;
825 debug_view_valid = 1;
826
827 /* We've read all we need from the executable. */
828 if (!backtrace_close (descriptor, error_callback, data))
829 goto fail;
830 descriptor = -1;
831
832 for (i = 0; i < (int) DEBUG_MAX; ++i)
833 {
834 if (sections[i].size == 0)
835 sections[i].data = NULL;
836 else
837 sections[i].data = ((const unsigned char *) debug_view.data
838 + (sections[i].offset - min_offset));
839 }
840
841 if (!backtrace_dwarf_add (state, base_address,
842 sections[DEBUG_INFO].data,
843 sections[DEBUG_INFO].size,
844 sections[DEBUG_LINE].data,
845 sections[DEBUG_LINE].size,
846 sections[DEBUG_ABBREV].data,
847 sections[DEBUG_ABBREV].size,
848 sections[DEBUG_RANGES].data,
849 sections[DEBUG_RANGES].size,
850 sections[DEBUG_STR].data,
851 sections[DEBUG_STR].size,
852 ehdr.e_ident[EI_DATA] == ELFDATA2MSB,
853 error_callback, data, fileline_fn))
854 goto fail;
855
856 *found_dwarf = 1;
857 elf_state->strtab_view = strtab_view;
858 elf_state->strtab_view_valid = 1;
859 elf_state->debug_view = debug_view;
860 elf_state->debug_view_valid = 1;
861
862 return 1;
863
864 fail:
865 if (shdrs_view_valid)
866 backtrace_release_view (state, &shdrs_view, error_callback, data);
867 if (names_view_valid)
868 backtrace_release_view (state, &names_view, error_callback, data);
869 if (symtab_view_valid)
870 backtrace_release_view (state, &symtab_view, error_callback, data);
871 if (strtab_view_valid)
872 backtrace_release_view (state, &strtab_view, error_callback, data);
873 if (debug_view_valid)
874 backtrace_release_view (state, &debug_view, error_callback, data);
875 if (descriptor != -1)
876 backtrace_close (descriptor, error_callback, data);
877 return 0;
878 }
879
880 /* Data passed to phdr_callback. */
881
882 struct phdr_data
883 {
884 struct backtrace_state *state;
885 backtrace_error_callback error_callback;
886 void *data;
887 fileline *fileline_fn;
888 int *found_sym;
889 int *found_dwarf;
890 int exe_descriptor;
891 };
892
893 /* Shared lib iterator callback to load the debug info. */
894
895 static int
896 #ifdef __i386__
897 __attribute__ ((__force_align_arg_pointer__))
898 #endif
phdr_callback(const char * name,uintptr_t addr,void * pdata)899 phdr_callback (const char *name, uintptr_t addr, void *pdata)
900 {
901 struct phdr_data *pd = (struct phdr_data *) pdata;
902 int descriptor;
903 int does_not_exist;
904 fileline elf_fileline_fn;
905 int found_dwarf;
906
907 /* There is not much we can do if we don't have the module name,
908 unless executable is ET_DYN, where we expect the very first
909 phdr_callback to be for the PIE. */
910 if (name == NULL || name[0] == '\0')
911 {
912 if (pd->exe_descriptor == -1)
913 return 0;
914 descriptor = pd->exe_descriptor;
915 pd->exe_descriptor = -1;
916 }
917 else
918 {
919 if (pd->exe_descriptor != -1)
920 {
921 backtrace_close (pd->exe_descriptor, pd->error_callback, pd->data);
922 pd->exe_descriptor = -1;
923 }
924
925 descriptor = backtrace_open (name, pd->error_callback,
926 pd->data, &does_not_exist);
927 if (descriptor < 0)
928 return 0;
929 }
930
931 if (elf_add (pd->state, descriptor, addr, 1, pd->error_callback,
932 pd->data, &elf_fileline_fn, pd->found_sym, &found_dwarf, 0))
933 {
934 if (found_dwarf)
935 {
936 *pd->found_dwarf = 1;
937 *pd->fileline_fn = elf_fileline_fn;
938 }
939 }
940
941 return 0;
942 }
943
944 /* Translate dl_iterate_phdr's args to ours. */
945
946 struct dl_iterate_data
947 {
948 backtrace_so_callback *callback;
949 void *data;
950 };
951
952 static int
dl_iterate_phdr_callback(struct dl_phdr_info * info,size_t size ATTRIBUTE_UNUSED,void * data)953 dl_iterate_phdr_callback (struct dl_phdr_info *info,
954 size_t size ATTRIBUTE_UNUSED,
955 void *data)
956 {
957 struct dl_iterate_data *dl_data = data;
958 return dl_data->callback (info->dlpi_name, info->dlpi_addr, dl_data->data);
959 }
960
961 static int
dl_iterate_phdr_wrapper(void * iter_state ATTRIBUTE_UNUSED,backtrace_so_callback * func,void * data)962 dl_iterate_phdr_wrapper (void *iter_state ATTRIBUTE_UNUSED,
963 backtrace_so_callback *func, void *data)
964 {
965 struct dl_iterate_data dl_data;
966 dl_data.callback = phdr_callback;
967 dl_data.data = data;
968 return dl_iterate_phdr (dl_iterate_phdr_callback, &dl_data);
969 }
970
971 /* Initialize the backtrace data we need from an ELF executable. At
972 the ELF level, all we need to do is find the debug info
973 sections.
974 Returns non-zero for success, zero for failure. */
975
976 int
backtrace_initialize(struct backtrace_state * state,int descriptor,backtrace_error_callback error_callback,void * data,fileline * fileline_fn)977 backtrace_initialize (struct backtrace_state *state, int descriptor,
978 backtrace_error_callback error_callback,
979 void *data, fileline *fileline_fn)
980 {
981 int ret;
982 int found_sym;
983 int found_dwarf;
984 fileline elf_fileline_fn = elf_nodebug;
985 struct phdr_data pd;
986
987 state->target_state =
988 backtrace_alloc (state, sizeof (struct elf_state), error_callback, data);
989 if (state->target_state == NULL)
990 return 0;
991 memset (state->target_state, 0, sizeof (*state->target_state));
992
993 ret = elf_add (state, descriptor,
994 state->base_address, state->base_address_set,
995 error_callback, data, &elf_fileline_fn,
996 &found_sym, &found_dwarf, 1);
997 if (!ret)
998 return 0;
999
1000 pd.state = state;
1001 pd.error_callback = error_callback;
1002 pd.data = data;
1003 pd.fileline_fn = &elf_fileline_fn;
1004 pd.found_sym = &found_sym;
1005 pd.found_dwarf = &found_dwarf;
1006 pd.exe_descriptor = ret < 0 ? descriptor : -1;
1007
1008 backtrace_so_iterator *iter_func = state->so_iterator;
1009 if (iter_func == NULL)
1010 iter_func = dl_iterate_phdr_wrapper;
1011 iter_func (state->iter_state, phdr_callback, (void *) &pd);
1012
1013 if (!state->threaded)
1014 {
1015 if (found_sym)
1016 state->syminfo_fn = elf_syminfo;
1017 else if (state->syminfo_fn == NULL)
1018 state->syminfo_fn = elf_nosyms;
1019 }
1020 else
1021 {
1022 if (found_sym)
1023 backtrace_atomic_store_pointer (&state->syminfo_fn, elf_syminfo);
1024 else
1025 (void) __sync_bool_compare_and_swap (&state->syminfo_fn, NULL,
1026 elf_nosyms);
1027 }
1028
1029 if (!state->threaded)
1030 {
1031 if (state->fileline_fn == NULL || state->fileline_fn == elf_nodebug)
1032 *fileline_fn = elf_fileline_fn;
1033 }
1034 else
1035 {
1036 fileline current_fn;
1037
1038 current_fn = backtrace_atomic_load_pointer (&state->fileline_fn);
1039 if (current_fn == NULL || current_fn == elf_nodebug)
1040 *fileline_fn = elf_fileline_fn;
1041 }
1042
1043 return 1;
1044 }
1045
1046 /* Free ELF-specific state.
1047 I desperately want to name this backtrace_finalize. */
1048
1049 void
backtrace_destroy_target(struct backtrace_state * state,backtrace_error_callback error_callback,void * data)1050 backtrace_destroy_target (struct backtrace_state *state,
1051 backtrace_error_callback error_callback,
1052 void *data)
1053 {
1054 struct elf_syminfo_data *sdata = state->syminfo_data;
1055
1056 while (sdata != NULL)
1057 {
1058 struct elf_syminfo_data *next = sdata->next;
1059 backtrace_free (state, sdata->symbols,
1060 sdata->count * sizeof (struct elf_symbol),
1061 error_callback, data);
1062 backtrace_free (state, sdata, sizeof (*sdata), error_callback, data);
1063 sdata = next;
1064 }
1065
1066 struct elf_state *elf = state->target_state;
1067
1068 if (elf == NULL)
1069 return;
1070
1071 if (elf->strtab_view_valid)
1072 backtrace_release_view (state, &elf->strtab_view, error_callback, data);
1073 if (elf->debug_view_valid)
1074 backtrace_release_view (state, &elf->debug_view, error_callback, data);
1075
1076 backtrace_free (state, elf, sizeof (*elf), error_callback, data);
1077 }
1078