]> git.ipfire.org Git - thirdparty/gcc.git/blob - libbacktrace/elf.c
re PR sanitizer/77631 (no symbols in backtrace shown by ASan when debug info is split)
[thirdparty/gcc.git] / libbacktrace / elf.c
1 /* elf.c -- Get debug data from an ELF file for backtraces.
2 Copyright (C) 2012-2017 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 <errno.h>
36 #include <stdlib.h>
37 #include <string.h>
38 #include <sys/types.h>
39 #include <sys/stat.h>
40 #include <unistd.h>
41
42 #ifdef HAVE_DL_ITERATE_PHDR
43 #include <link.h>
44 #endif
45
46 #include "backtrace.h"
47 #include "internal.h"
48
49 #ifndef S_ISLNK
50 #ifndef S_IFLNK
51 #define S_IFLNK 0120000
52 #endif
53 #ifndef S_IFMT
54 #define S_IFMT 0170000
55 #endif
56 #define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
57 #endif
58
59 #if !defined(HAVE_DECL_STRNLEN) || !HAVE_DECL_STRNLEN
60
61 /* If strnlen is not declared, provide our own version. */
62
63 static size_t
64 xstrnlen (const char *s, size_t maxlen)
65 {
66 size_t i;
67
68 for (i = 0; i < maxlen; ++i)
69 if (s[i] == '\0')
70 break;
71 return i;
72 }
73
74 #define strnlen xstrnlen
75
76 #endif
77
78 #ifndef HAVE_LSTAT
79
80 /* Dummy version of lstat for systems that don't have it. */
81
82 static int
83 xlstat (const char *path ATTRIBUTE_UNUSED, struct stat *st ATTRIBUTE_UNUSED)
84 {
85 return -1;
86 }
87
88 #define lstat xlstat
89
90 #endif
91
92 #ifndef HAVE_READLINK
93
94 /* Dummy version of readlink for systems that don't have it. */
95
96 static ssize_t
97 xreadlink (const char *path ATTRIBUTE_UNUSED, char *buf ATTRIBUTE_UNUSED,
98 size_t bufsz ATTRIBUTE_UNUSED)
99 {
100 return -1;
101 }
102
103 #define readlink xreadlink
104
105 #endif
106
107 #ifndef HAVE_DL_ITERATE_PHDR
108
109 /* Dummy version of dl_iterate_phdr for systems that don't have it. */
110
111 #define dl_phdr_info x_dl_phdr_info
112 #define dl_iterate_phdr x_dl_iterate_phdr
113
114 struct dl_phdr_info
115 {
116 uintptr_t dlpi_addr;
117 const char *dlpi_name;
118 };
119
120 static int
121 dl_iterate_phdr (int (*callback) (struct dl_phdr_info *,
122 size_t, void *) ATTRIBUTE_UNUSED,
123 void *data ATTRIBUTE_UNUSED)
124 {
125 return 0;
126 }
127
128 #endif /* ! defined (HAVE_DL_ITERATE_PHDR) */
129
130 /* The configure script must tell us whether we are 32-bit or 64-bit
131 ELF. We could make this code test and support either possibility,
132 but there is no point. This code only works for the currently
133 running executable, which means that we know the ELF mode at
134 configure time. */
135
136 #if BACKTRACE_ELF_SIZE != 32 && BACKTRACE_ELF_SIZE != 64
137 #error "Unknown BACKTRACE_ELF_SIZE"
138 #endif
139
140 /* <link.h> might #include <elf.h> which might define our constants
141 with slightly different values. Undefine them to be safe. */
142
143 #undef EI_NIDENT
144 #undef EI_MAG0
145 #undef EI_MAG1
146 #undef EI_MAG2
147 #undef EI_MAG3
148 #undef EI_CLASS
149 #undef EI_DATA
150 #undef EI_VERSION
151 #undef ELF_MAG0
152 #undef ELF_MAG1
153 #undef ELF_MAG2
154 #undef ELF_MAG3
155 #undef ELFCLASS32
156 #undef ELFCLASS64
157 #undef ELFDATA2LSB
158 #undef ELFDATA2MSB
159 #undef EV_CURRENT
160 #undef ET_DYN
161 #undef SHN_LORESERVE
162 #undef SHN_XINDEX
163 #undef SHN_UNDEF
164 #undef SHT_SYMTAB
165 #undef SHT_STRTAB
166 #undef SHT_DYNSYM
167 #undef STT_OBJECT
168 #undef STT_FUNC
169 #undef NT_GNU_BUILD_ID
170
171 /* Basic types. */
172
173 typedef uint16_t b_elf_half; /* Elf_Half. */
174 typedef uint32_t b_elf_word; /* Elf_Word. */
175 typedef int32_t b_elf_sword; /* Elf_Sword. */
176
177 #if BACKTRACE_ELF_SIZE == 32
178
179 typedef uint32_t b_elf_addr; /* Elf_Addr. */
180 typedef uint32_t b_elf_off; /* Elf_Off. */
181
182 typedef uint32_t b_elf_wxword; /* 32-bit Elf_Word, 64-bit ELF_Xword. */
183
184 #else
185
186 typedef uint64_t b_elf_addr; /* Elf_Addr. */
187 typedef uint64_t b_elf_off; /* Elf_Off. */
188 typedef uint64_t b_elf_xword; /* Elf_Xword. */
189 typedef int64_t b_elf_sxword; /* Elf_Sxword. */
190
191 typedef uint64_t b_elf_wxword; /* 32-bit Elf_Word, 64-bit ELF_Xword. */
192
193 #endif
194
195 /* Data structures and associated constants. */
196
197 #define EI_NIDENT 16
198
199 typedef struct {
200 unsigned char e_ident[EI_NIDENT]; /* ELF "magic number" */
201 b_elf_half e_type; /* Identifies object file type */
202 b_elf_half e_machine; /* Specifies required architecture */
203 b_elf_word e_version; /* Identifies object file version */
204 b_elf_addr e_entry; /* Entry point virtual address */
205 b_elf_off e_phoff; /* Program header table file offset */
206 b_elf_off e_shoff; /* Section header table file offset */
207 b_elf_word e_flags; /* Processor-specific flags */
208 b_elf_half e_ehsize; /* ELF header size in bytes */
209 b_elf_half e_phentsize; /* Program header table entry size */
210 b_elf_half e_phnum; /* Program header table entry count */
211 b_elf_half e_shentsize; /* Section header table entry size */
212 b_elf_half e_shnum; /* Section header table entry count */
213 b_elf_half e_shstrndx; /* Section header string table index */
214 } b_elf_ehdr; /* Elf_Ehdr. */
215
216 #define EI_MAG0 0
217 #define EI_MAG1 1
218 #define EI_MAG2 2
219 #define EI_MAG3 3
220 #define EI_CLASS 4
221 #define EI_DATA 5
222 #define EI_VERSION 6
223
224 #define ELFMAG0 0x7f
225 #define ELFMAG1 'E'
226 #define ELFMAG2 'L'
227 #define ELFMAG3 'F'
228
229 #define ELFCLASS32 1
230 #define ELFCLASS64 2
231
232 #define ELFDATA2LSB 1
233 #define ELFDATA2MSB 2
234
235 #define EV_CURRENT 1
236
237 #define ET_DYN 3
238
239 typedef struct {
240 b_elf_word sh_name; /* Section name, index in string tbl */
241 b_elf_word sh_type; /* Type of section */
242 b_elf_wxword sh_flags; /* Miscellaneous section attributes */
243 b_elf_addr sh_addr; /* Section virtual addr at execution */
244 b_elf_off sh_offset; /* Section file offset */
245 b_elf_wxword sh_size; /* Size of section in bytes */
246 b_elf_word sh_link; /* Index of another section */
247 b_elf_word sh_info; /* Additional section information */
248 b_elf_wxword sh_addralign; /* Section alignment */
249 b_elf_wxword sh_entsize; /* Entry size if section holds table */
250 } b_elf_shdr; /* Elf_Shdr. */
251
252 #define SHN_UNDEF 0x0000 /* Undefined section */
253 #define SHN_LORESERVE 0xFF00 /* Begin range of reserved indices */
254 #define SHN_XINDEX 0xFFFF /* Section index is held elsewhere */
255
256 #define SHT_SYMTAB 2
257 #define SHT_STRTAB 3
258 #define SHT_DYNSYM 11
259
260 #if BACKTRACE_ELF_SIZE == 32
261
262 typedef struct
263 {
264 b_elf_word st_name; /* Symbol name, index in string tbl */
265 b_elf_addr st_value; /* Symbol value */
266 b_elf_word st_size; /* Symbol size */
267 unsigned char st_info; /* Symbol binding and type */
268 unsigned char st_other; /* Visibility and other data */
269 b_elf_half st_shndx; /* Symbol section index */
270 } b_elf_sym; /* Elf_Sym. */
271
272 #else /* BACKTRACE_ELF_SIZE != 32 */
273
274 typedef struct
275 {
276 b_elf_word st_name; /* Symbol name, index in string tbl */
277 unsigned char st_info; /* Symbol binding and type */
278 unsigned char st_other; /* Visibility and other data */
279 b_elf_half st_shndx; /* Symbol section index */
280 b_elf_addr st_value; /* Symbol value */
281 b_elf_xword st_size; /* Symbol size */
282 } b_elf_sym; /* Elf_Sym. */
283
284 #endif /* BACKTRACE_ELF_SIZE != 32 */
285
286 #define STT_OBJECT 1
287 #define STT_FUNC 2
288
289 typedef struct
290 {
291 uint32_t namesz;
292 uint32_t descsz;
293 uint32_t type;
294 char name[1];
295 } b_elf_note;
296
297 #define NT_GNU_BUILD_ID 3
298
299 /* An index of ELF sections we care about. */
300
301 enum debug_section
302 {
303 DEBUG_INFO,
304 DEBUG_LINE,
305 DEBUG_ABBREV,
306 DEBUG_RANGES,
307 DEBUG_STR,
308 DEBUG_MAX
309 };
310
311 /* Names of sections, indexed by enum elf_section. */
312
313 static const char * const debug_section_names[DEBUG_MAX] =
314 {
315 ".debug_info",
316 ".debug_line",
317 ".debug_abbrev",
318 ".debug_ranges",
319 ".debug_str"
320 };
321
322 /* Information we gather for the sections we care about. */
323
324 struct debug_section_info
325 {
326 /* Section file offset. */
327 off_t offset;
328 /* Section size. */
329 size_t size;
330 /* Section contents, after read from file. */
331 const unsigned char *data;
332 };
333
334 /* Information we keep for an ELF symbol. */
335
336 struct elf_symbol
337 {
338 /* The name of the symbol. */
339 const char *name;
340 /* The address of the symbol. */
341 uintptr_t address;
342 /* The size of the symbol. */
343 size_t size;
344 };
345
346 /* Information to pass to elf_syminfo. */
347
348 struct elf_syminfo_data
349 {
350 /* Symbols for the next module. */
351 struct elf_syminfo_data *next;
352 /* The ELF symbols, sorted by address. */
353 struct elf_symbol *symbols;
354 /* The number of symbols. */
355 size_t count;
356 };
357
358 /* Compute the CRC-32 of BUF/LEN. This uses the CRC used for
359 .gnu_debuglink files. */
360
361 static uint32_t
362 elf_crc32 (uint32_t crc, const unsigned char *buf, size_t len)
363 {
364 static const uint32_t crc32_table[256] =
365 {
366 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
367 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
368 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
369 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
370 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
371 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
372 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
373 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
374 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
375 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
376 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
377 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
378 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
379 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
380 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
381 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
382 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
383 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
384 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
385 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
386 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
387 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
388 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
389 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
390 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
391 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
392 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
393 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
394 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
395 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
396 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
397 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
398 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
399 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
400 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
401 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
402 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
403 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
404 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
405 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
406 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
407 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
408 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
409 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
410 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
411 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
412 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
413 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
414 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
415 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
416 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
417 0x2d02ef8d
418 };
419 const unsigned char *end;
420
421 crc = ~crc;
422 for (end = buf + len; buf < end; ++ buf)
423 crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
424 return ~crc;
425 }
426
427 /* Return the CRC-32 of the entire file open at DESCRIPTOR. */
428
429 static uint32_t
430 elf_crc32_file (struct backtrace_state *state, int descriptor,
431 backtrace_error_callback error_callback, void *data)
432 {
433 struct stat st;
434 struct backtrace_view file_view;
435 uint32_t ret;
436
437 if (fstat (descriptor, &st) < 0)
438 {
439 error_callback (data, "fstat", errno);
440 return 0;
441 }
442
443 if (!backtrace_get_view (state, descriptor, 0, st.st_size, error_callback,
444 data, &file_view))
445 return 0;
446
447 ret = elf_crc32 (0, (const unsigned char *) file_view.data, st.st_size);
448
449 backtrace_release_view (state, &file_view, error_callback, data);
450
451 return ret;
452 }
453
454 /* A dummy callback function used when we can't find any debug info. */
455
456 static int
457 elf_nodebug (struct backtrace_state *state ATTRIBUTE_UNUSED,
458 uintptr_t pc ATTRIBUTE_UNUSED,
459 backtrace_full_callback callback ATTRIBUTE_UNUSED,
460 backtrace_error_callback error_callback, void *data)
461 {
462 error_callback (data, "no debug info in ELF executable", -1);
463 return 0;
464 }
465
466 /* A dummy callback function used when we can't find a symbol
467 table. */
468
469 static void
470 elf_nosyms (struct backtrace_state *state ATTRIBUTE_UNUSED,
471 uintptr_t addr ATTRIBUTE_UNUSED,
472 backtrace_syminfo_callback callback ATTRIBUTE_UNUSED,
473 backtrace_error_callback error_callback, void *data)
474 {
475 error_callback (data, "no symbol table in ELF executable", -1);
476 }
477
478 /* Compare struct elf_symbol for qsort. */
479
480 static int
481 elf_symbol_compare (const void *v1, const void *v2)
482 {
483 const struct elf_symbol *e1 = (const struct elf_symbol *) v1;
484 const struct elf_symbol *e2 = (const struct elf_symbol *) v2;
485
486 if (e1->address < e2->address)
487 return -1;
488 else if (e1->address > e2->address)
489 return 1;
490 else
491 return 0;
492 }
493
494 /* Compare an ADDR against an elf_symbol for bsearch. We allocate one
495 extra entry in the array so that this can look safely at the next
496 entry. */
497
498 static int
499 elf_symbol_search (const void *vkey, const void *ventry)
500 {
501 const uintptr_t *key = (const uintptr_t *) vkey;
502 const struct elf_symbol *entry = (const struct elf_symbol *) ventry;
503 uintptr_t addr;
504
505 addr = *key;
506 if (addr < entry->address)
507 return -1;
508 else if (addr >= entry->address + entry->size)
509 return 1;
510 else
511 return 0;
512 }
513
514 /* Initialize the symbol table info for elf_syminfo. */
515
516 static int
517 elf_initialize_syminfo (struct backtrace_state *state,
518 uintptr_t base_address,
519 const unsigned char *symtab_data, size_t symtab_size,
520 const unsigned char *strtab, size_t strtab_size,
521 backtrace_error_callback error_callback,
522 void *data, struct elf_syminfo_data *sdata)
523 {
524 size_t sym_count;
525 const b_elf_sym *sym;
526 size_t elf_symbol_count;
527 size_t elf_symbol_size;
528 struct elf_symbol *elf_symbols;
529 size_t i;
530 unsigned int j;
531
532 sym_count = symtab_size / sizeof (b_elf_sym);
533
534 /* We only care about function symbols. Count them. */
535 sym = (const b_elf_sym *) symtab_data;
536 elf_symbol_count = 0;
537 for (i = 0; i < sym_count; ++i, ++sym)
538 {
539 int info;
540
541 info = sym->st_info & 0xf;
542 if ((info == STT_FUNC || info == STT_OBJECT)
543 && sym->st_shndx != SHN_UNDEF)
544 ++elf_symbol_count;
545 }
546
547 elf_symbol_size = elf_symbol_count * sizeof (struct elf_symbol);
548 elf_symbols = ((struct elf_symbol *)
549 backtrace_alloc (state, elf_symbol_size, error_callback,
550 data));
551 if (elf_symbols == NULL)
552 return 0;
553
554 sym = (const b_elf_sym *) symtab_data;
555 j = 0;
556 for (i = 0; i < sym_count; ++i, ++sym)
557 {
558 int info;
559
560 info = sym->st_info & 0xf;
561 if (info != STT_FUNC && info != STT_OBJECT)
562 continue;
563 if (sym->st_shndx == SHN_UNDEF)
564 continue;
565 if (sym->st_name >= strtab_size)
566 {
567 error_callback (data, "symbol string index out of range", 0);
568 backtrace_free (state, elf_symbols, elf_symbol_size, error_callback,
569 data);
570 return 0;
571 }
572 elf_symbols[j].name = (const char *) strtab + sym->st_name;
573 elf_symbols[j].address = sym->st_value + base_address;
574 elf_symbols[j].size = sym->st_size;
575 ++j;
576 }
577
578 backtrace_qsort (elf_symbols, elf_symbol_count, sizeof (struct elf_symbol),
579 elf_symbol_compare);
580
581 sdata->next = NULL;
582 sdata->symbols = elf_symbols;
583 sdata->count = elf_symbol_count;
584
585 return 1;
586 }
587
588 /* Add EDATA to the list in STATE. */
589
590 static void
591 elf_add_syminfo_data (struct backtrace_state *state,
592 struct elf_syminfo_data *edata)
593 {
594 if (!state->threaded)
595 {
596 struct elf_syminfo_data **pp;
597
598 for (pp = (struct elf_syminfo_data **) (void *) &state->syminfo_data;
599 *pp != NULL;
600 pp = &(*pp)->next)
601 ;
602 *pp = edata;
603 }
604 else
605 {
606 while (1)
607 {
608 struct elf_syminfo_data **pp;
609
610 pp = (struct elf_syminfo_data **) (void *) &state->syminfo_data;
611
612 while (1)
613 {
614 struct elf_syminfo_data *p;
615
616 p = backtrace_atomic_load_pointer (pp);
617
618 if (p == NULL)
619 break;
620
621 pp = &p->next;
622 }
623
624 if (__sync_bool_compare_and_swap (pp, NULL, edata))
625 break;
626 }
627 }
628 }
629
630 /* Return the symbol name and value for an ADDR. */
631
632 static void
633 elf_syminfo (struct backtrace_state *state, uintptr_t addr,
634 backtrace_syminfo_callback callback,
635 backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
636 void *data)
637 {
638 struct elf_syminfo_data *edata;
639 struct elf_symbol *sym = NULL;
640
641 if (!state->threaded)
642 {
643 for (edata = (struct elf_syminfo_data *) state->syminfo_data;
644 edata != NULL;
645 edata = edata->next)
646 {
647 sym = ((struct elf_symbol *)
648 bsearch (&addr, edata->symbols, edata->count,
649 sizeof (struct elf_symbol), elf_symbol_search));
650 if (sym != NULL)
651 break;
652 }
653 }
654 else
655 {
656 struct elf_syminfo_data **pp;
657
658 pp = (struct elf_syminfo_data **) (void *) &state->syminfo_data;
659 while (1)
660 {
661 edata = backtrace_atomic_load_pointer (pp);
662 if (edata == NULL)
663 break;
664
665 sym = ((struct elf_symbol *)
666 bsearch (&addr, edata->symbols, edata->count,
667 sizeof (struct elf_symbol), elf_symbol_search));
668 if (sym != NULL)
669 break;
670
671 pp = &edata->next;
672 }
673 }
674
675 if (sym == NULL)
676 callback (data, addr, NULL, 0, 0);
677 else
678 callback (data, addr, sym->name, sym->address, sym->size);
679 }
680
681 /* Return whether FILENAME is a symlink. */
682
683 static int
684 elf_is_symlink (const char *filename)
685 {
686 struct stat st;
687
688 if (lstat (filename, &st) < 0)
689 return 0;
690 return S_ISLNK (st.st_mode);
691 }
692
693 /* Return the results of reading the symlink FILENAME in a buffer
694 allocated by backtrace_alloc. Return the length of the buffer in
695 *LEN. */
696
697 static char *
698 elf_readlink (struct backtrace_state *state, const char *filename,
699 backtrace_error_callback error_callback, void *data,
700 size_t *plen)
701 {
702 size_t len;
703 char *buf;
704
705 len = 128;
706 while (1)
707 {
708 ssize_t rl;
709
710 buf = backtrace_alloc (state, len, error_callback, data);
711 if (buf == NULL)
712 return NULL;
713 rl = readlink (filename, buf, len);
714 if (rl < 0)
715 {
716 backtrace_free (state, buf, len, error_callback, data);
717 return NULL;
718 }
719 if ((size_t) rl < len - 1)
720 {
721 buf[rl] = '\0';
722 *plen = len;
723 return buf;
724 }
725 backtrace_free (state, buf, len, error_callback, data);
726 len *= 2;
727 }
728 }
729
730 /* Open a separate debug info file, using the build ID to find it.
731 Returns an open file descriptor, or -1.
732
733 The GDB manual says that the only place gdb looks for a debug file
734 when the build ID is known is in /usr/lib/debug/.build-id. */
735
736 static int
737 elf_open_debugfile_by_buildid (struct backtrace_state *state,
738 const char *buildid_data, size_t buildid_size,
739 backtrace_error_callback error_callback,
740 void *data)
741 {
742 const char * const prefix = "/usr/lib/debug/.build-id/";
743 const size_t prefix_len = strlen (prefix);
744 const char * const suffix = ".debug";
745 const size_t suffix_len = strlen (suffix);
746 size_t len;
747 char *bd_filename;
748 char *t;
749 size_t i;
750 int ret;
751 int does_not_exist;
752
753 len = prefix_len + buildid_size * 2 + suffix_len + 2;
754 bd_filename = backtrace_alloc (state, len, error_callback, data);
755 if (bd_filename == NULL)
756 return -1;
757
758 t = bd_filename;
759 memcpy (t, prefix, prefix_len);
760 t += prefix_len;
761 for (i = 0; i < buildid_size; i++)
762 {
763 unsigned char b;
764 unsigned char nib;
765
766 b = (unsigned char) buildid_data[i];
767 nib = (b & 0xf0) >> 4;
768 *t++ = nib < 10 ? '0' + nib : 'a' + nib - 10;
769 nib = b & 0x0f;
770 *t++ = nib < 10 ? '0' + nib : 'a' + nib - 10;
771 if (i == 0)
772 *t++ = '/';
773 }
774 memcpy (t, suffix, suffix_len);
775 t[suffix_len] = '\0';
776
777 ret = backtrace_open (bd_filename, error_callback, data, &does_not_exist);
778
779 backtrace_free (state, bd_filename, len, error_callback, data);
780
781 /* gdb checks that the debuginfo file has the same build ID note.
782 That seems kind of pointless to me--why would it have the right
783 name but not the right build ID?--so skipping the check. */
784
785 return ret;
786 }
787
788 /* Try to open a file whose name is PREFIX (length PREFIX_LEN)
789 concatenated with PREFIX2 (length PREFIX2_LEN) concatenated with
790 DEBUGLINK_NAME. Returns an open file descriptor, or -1. */
791
792 static int
793 elf_try_debugfile (struct backtrace_state *state, const char *prefix,
794 size_t prefix_len, const char *prefix2, size_t prefix2_len,
795 const char *debuglink_name,
796 backtrace_error_callback error_callback, void *data)
797 {
798 size_t debuglink_len;
799 size_t try_len;
800 char *try;
801 int does_not_exist;
802 int ret;
803
804 debuglink_len = strlen (debuglink_name);
805 try_len = prefix_len + prefix2_len + debuglink_len + 1;
806 try = backtrace_alloc (state, try_len, error_callback, data);
807 if (try == NULL)
808 return -1;
809
810 memcpy (try, prefix, prefix_len);
811 memcpy (try + prefix_len, prefix2, prefix2_len);
812 memcpy (try + prefix_len + prefix2_len, debuglink_name, debuglink_len);
813 try[prefix_len + prefix2_len + debuglink_len] = '\0';
814
815 ret = backtrace_open (try, error_callback, data, &does_not_exist);
816
817 backtrace_free (state, try, try_len, error_callback, data);
818
819 return ret;
820 }
821
822 /* Find a separate debug info file, using the debuglink section data
823 to find it. Returns an open file descriptor, or -1. */
824
825 static int
826 elf_find_debugfile_by_debuglink (struct backtrace_state *state,
827 const char *filename,
828 const char *debuglink_name,
829 backtrace_error_callback error_callback,
830 void *data)
831 {
832 int ret;
833 char *alc;
834 size_t alc_len;
835 const char *slash;
836 int ddescriptor;
837 const char *prefix;
838 size_t prefix_len;
839
840 /* Resolve symlinks in FILENAME. Since FILENAME is fairly likely to
841 be /proc/self/exe, symlinks are common. We don't try to resolve
842 the whole path name, just the base name. */
843 ret = -1;
844 alc = NULL;
845 alc_len = 0;
846 while (elf_is_symlink (filename))
847 {
848 char *new_buf;
849 size_t new_len;
850
851 new_buf = elf_readlink (state, filename, error_callback, data, &new_len);
852 if (new_buf == NULL)
853 break;
854
855 if (new_buf[0] == '/')
856 filename = new_buf;
857 else
858 {
859 slash = strrchr (filename, '/');
860 if (slash == NULL)
861 filename = new_buf;
862 else
863 {
864 size_t clen;
865 char *c;
866
867 slash++;
868 clen = slash - filename + strlen (new_buf) + 1;
869 c = backtrace_alloc (state, clen, error_callback, data);
870 if (c == NULL)
871 goto done;
872
873 memcpy (c, filename, slash - filename);
874 memcpy (c + (slash - filename), new_buf, strlen (new_buf));
875 c[slash - filename + strlen (new_buf)] = '\0';
876 backtrace_free (state, new_buf, new_len, error_callback, data);
877 filename = c;
878 new_buf = c;
879 new_len = clen;
880 }
881 }
882
883 if (alc != NULL)
884 backtrace_free (state, alc, alc_len, error_callback, data);
885 alc = new_buf;
886 alc_len = new_len;
887 }
888
889 /* Look for DEBUGLINK_NAME in the same directory as FILENAME. */
890
891 slash = strrchr (filename, '/');
892 if (slash == NULL)
893 {
894 prefix = "";
895 prefix_len = 0;
896 }
897 else
898 {
899 slash++;
900 prefix = filename;
901 prefix_len = slash - filename;
902 }
903
904 ddescriptor = elf_try_debugfile (state, prefix, prefix_len, "", 0,
905 debuglink_name, error_callback, data);
906 if (ddescriptor >= 0)
907 {
908 ret = ddescriptor;
909 goto done;
910 }
911
912 /* Look for DEBUGLINK_NAME in a .debug subdirectory of FILENAME. */
913
914 ddescriptor = elf_try_debugfile (state, prefix, prefix_len, ".debug/",
915 strlen (".debug/"), debuglink_name,
916 error_callback, data);
917 if (ddescriptor >= 0)
918 {
919 ret = ddescriptor;
920 goto done;
921 }
922
923 /* Look for DEBUGLINK_NAME in /usr/lib/debug. */
924
925 ddescriptor = elf_try_debugfile (state, "/usr/lib/debug/",
926 strlen ("/usr/lib/debug/"), prefix,
927 prefix_len, debuglink_name,
928 error_callback, data);
929 if (ddescriptor >= 0)
930 ret = ddescriptor;
931
932 done:
933 if (alc != NULL && alc_len > 0)
934 backtrace_free (state, alc, alc_len, error_callback, data);
935 return ret;
936 }
937
938 /* Open a separate debug info file, using the debuglink section data
939 to find it. Returns an open file descriptor, or -1. */
940
941 static int
942 elf_open_debugfile_by_debuglink (struct backtrace_state *state,
943 const char *filename,
944 const char *debuglink_name,
945 uint32_t debuglink_crc,
946 backtrace_error_callback error_callback,
947 void *data)
948 {
949 int ddescriptor;
950 uint32_t got_crc;
951
952 ddescriptor = elf_find_debugfile_by_debuglink (state, filename,
953 debuglink_name,
954 error_callback, data);
955 if (ddescriptor < 0)
956 return -1;
957
958 got_crc = elf_crc32_file (state, ddescriptor, error_callback, data);
959 if (got_crc != debuglink_crc)
960 {
961 backtrace_close (ddescriptor, error_callback, data);
962 return -1;
963 }
964
965 return ddescriptor;
966 }
967
968 /* Add the backtrace data for one ELF file. Returns 1 on success,
969 0 on failure (in both cases descriptor is closed) or -1 if exe
970 is non-zero and the ELF file is ET_DYN, which tells the caller that
971 elf_add will need to be called on the descriptor again after
972 base_address is determined. */
973
974 static int
975 elf_add (struct backtrace_state *state, const char *filename, int descriptor,
976 uintptr_t base_address, backtrace_error_callback error_callback,
977 void *data, fileline *fileline_fn, int *found_sym, int *found_dwarf,
978 int exe, int debuginfo)
979 {
980 struct backtrace_view ehdr_view;
981 b_elf_ehdr ehdr;
982 off_t shoff;
983 unsigned int shnum;
984 unsigned int shstrndx;
985 struct backtrace_view shdrs_view;
986 int shdrs_view_valid;
987 const b_elf_shdr *shdrs;
988 const b_elf_shdr *shstrhdr;
989 size_t shstr_size;
990 off_t shstr_off;
991 struct backtrace_view names_view;
992 int names_view_valid;
993 const char *names;
994 unsigned int symtab_shndx;
995 unsigned int dynsym_shndx;
996 unsigned int i;
997 struct debug_section_info sections[DEBUG_MAX];
998 struct backtrace_view symtab_view;
999 int symtab_view_valid;
1000 struct backtrace_view strtab_view;
1001 int strtab_view_valid;
1002 struct backtrace_view buildid_view;
1003 int buildid_view_valid;
1004 const char *buildid_data;
1005 uint32_t buildid_size;
1006 struct backtrace_view debuglink_view;
1007 int debuglink_view_valid;
1008 const char *debuglink_name;
1009 uint32_t debuglink_crc;
1010 off_t min_offset;
1011 off_t max_offset;
1012 struct backtrace_view debug_view;
1013 int debug_view_valid;
1014
1015 *found_sym = 0;
1016 *found_dwarf = 0;
1017
1018 shdrs_view_valid = 0;
1019 names_view_valid = 0;
1020 symtab_view_valid = 0;
1021 strtab_view_valid = 0;
1022 buildid_view_valid = 0;
1023 buildid_data = NULL;
1024 buildid_size = 0;
1025 debuglink_view_valid = 0;
1026 debuglink_name = NULL;
1027 debuglink_crc = 0;
1028 debug_view_valid = 0;
1029
1030 if (!backtrace_get_view (state, descriptor, 0, sizeof ehdr, error_callback,
1031 data, &ehdr_view))
1032 goto fail;
1033
1034 memcpy (&ehdr, ehdr_view.data, sizeof ehdr);
1035
1036 backtrace_release_view (state, &ehdr_view, error_callback, data);
1037
1038 if (ehdr.e_ident[EI_MAG0] != ELFMAG0
1039 || ehdr.e_ident[EI_MAG1] != ELFMAG1
1040 || ehdr.e_ident[EI_MAG2] != ELFMAG2
1041 || ehdr.e_ident[EI_MAG3] != ELFMAG3)
1042 {
1043 error_callback (data, "executable file is not ELF", 0);
1044 goto fail;
1045 }
1046 if (ehdr.e_ident[EI_VERSION] != EV_CURRENT)
1047 {
1048 error_callback (data, "executable file is unrecognized ELF version", 0);
1049 goto fail;
1050 }
1051
1052 #if BACKTRACE_ELF_SIZE == 32
1053 #define BACKTRACE_ELFCLASS ELFCLASS32
1054 #else
1055 #define BACKTRACE_ELFCLASS ELFCLASS64
1056 #endif
1057
1058 if (ehdr.e_ident[EI_CLASS] != BACKTRACE_ELFCLASS)
1059 {
1060 error_callback (data, "executable file is unexpected ELF class", 0);
1061 goto fail;
1062 }
1063
1064 if (ehdr.e_ident[EI_DATA] != ELFDATA2LSB
1065 && ehdr.e_ident[EI_DATA] != ELFDATA2MSB)
1066 {
1067 error_callback (data, "executable file has unknown endianness", 0);
1068 goto fail;
1069 }
1070
1071 /* If the executable is ET_DYN, it is either a PIE, or we are running
1072 directly a shared library with .interp. We need to wait for
1073 dl_iterate_phdr in that case to determine the actual base_address. */
1074 if (exe && ehdr.e_type == ET_DYN)
1075 return -1;
1076
1077 shoff = ehdr.e_shoff;
1078 shnum = ehdr.e_shnum;
1079 shstrndx = ehdr.e_shstrndx;
1080
1081 if ((shnum == 0 || shstrndx == SHN_XINDEX)
1082 && shoff != 0)
1083 {
1084 struct backtrace_view shdr_view;
1085 const b_elf_shdr *shdr;
1086
1087 if (!backtrace_get_view (state, descriptor, shoff, sizeof shdr,
1088 error_callback, data, &shdr_view))
1089 goto fail;
1090
1091 shdr = (const b_elf_shdr *) shdr_view.data;
1092
1093 if (shnum == 0)
1094 shnum = shdr->sh_size;
1095
1096 if (shstrndx == SHN_XINDEX)
1097 {
1098 shstrndx = shdr->sh_link;
1099
1100 /* Versions of the GNU binutils between 2.12 and 2.18 did
1101 not handle objects with more than SHN_LORESERVE sections
1102 correctly. All large section indexes were offset by
1103 0x100. There is more information at
1104 http://sourceware.org/bugzilla/show_bug.cgi?id-5900 .
1105 Fortunately these object files are easy to detect, as the
1106 GNU binutils always put the section header string table
1107 near the end of the list of sections. Thus if the
1108 section header string table index is larger than the
1109 number of sections, then we know we have to subtract
1110 0x100 to get the real section index. */
1111 if (shstrndx >= shnum && shstrndx >= SHN_LORESERVE + 0x100)
1112 shstrndx -= 0x100;
1113 }
1114
1115 backtrace_release_view (state, &shdr_view, error_callback, data);
1116 }
1117
1118 /* To translate PC to file/line when using DWARF, we need to find
1119 the .debug_info and .debug_line sections. */
1120
1121 /* Read the section headers, skipping the first one. */
1122
1123 if (!backtrace_get_view (state, descriptor, shoff + sizeof (b_elf_shdr),
1124 (shnum - 1) * sizeof (b_elf_shdr),
1125 error_callback, data, &shdrs_view))
1126 goto fail;
1127 shdrs_view_valid = 1;
1128 shdrs = (const b_elf_shdr *) shdrs_view.data;
1129
1130 /* Read the section names. */
1131
1132 shstrhdr = &shdrs[shstrndx - 1];
1133 shstr_size = shstrhdr->sh_size;
1134 shstr_off = shstrhdr->sh_offset;
1135
1136 if (!backtrace_get_view (state, descriptor, shstr_off, shstr_size,
1137 error_callback, data, &names_view))
1138 goto fail;
1139 names_view_valid = 1;
1140 names = (const char *) names_view.data;
1141
1142 symtab_shndx = 0;
1143 dynsym_shndx = 0;
1144
1145 memset (sections, 0, sizeof sections);
1146
1147 /* Look for the symbol table. */
1148 for (i = 1; i < shnum; ++i)
1149 {
1150 const b_elf_shdr *shdr;
1151 unsigned int sh_name;
1152 const char *name;
1153 int j;
1154
1155 shdr = &shdrs[i - 1];
1156
1157 if (shdr->sh_type == SHT_SYMTAB)
1158 symtab_shndx = i;
1159 else if (shdr->sh_type == SHT_DYNSYM)
1160 dynsym_shndx = i;
1161
1162 sh_name = shdr->sh_name;
1163 if (sh_name >= shstr_size)
1164 {
1165 error_callback (data, "ELF section name out of range", 0);
1166 goto fail;
1167 }
1168
1169 name = names + sh_name;
1170
1171 for (j = 0; j < (int) DEBUG_MAX; ++j)
1172 {
1173 if (strcmp (name, debug_section_names[j]) == 0)
1174 {
1175 sections[j].offset = shdr->sh_offset;
1176 sections[j].size = shdr->sh_size;
1177 break;
1178 }
1179 }
1180
1181 /* Read the build ID if present. This could check for any
1182 SHT_NOTE section with the right note name and type, but gdb
1183 looks for a specific section name. */
1184 if (!debuginfo
1185 && !buildid_view_valid
1186 && strcmp (name, ".note.gnu.build-id") == 0)
1187 {
1188 const b_elf_note *note;
1189
1190 if (!backtrace_get_view (state, descriptor, shdr->sh_offset,
1191 shdr->sh_size, error_callback, data,
1192 &buildid_view))
1193 goto fail;
1194
1195 buildid_view_valid = 1;
1196 note = (const b_elf_note *) buildid_view.data;
1197 if (note->type == NT_GNU_BUILD_ID
1198 && note->namesz == 4
1199 && strncmp (note->name, "GNU", 4) == 0
1200 && shdr->sh_size < 12 + ((note->namesz + 3) & ~ 3) + note->descsz)
1201 {
1202 buildid_data = &note->name[0] + ((note->namesz + 3) & ~ 3);
1203 buildid_size = note->descsz;
1204 }
1205 }
1206
1207 /* Read the debuglink file if present. */
1208 if (!debuginfo
1209 && !debuglink_view_valid
1210 && strcmp (name, ".gnu_debuglink") == 0)
1211 {
1212 const char *debuglink_data;
1213 size_t crc_offset;
1214
1215 if (!backtrace_get_view (state, descriptor, shdr->sh_offset,
1216 shdr->sh_size, error_callback, data,
1217 &debuglink_view))
1218 goto fail;
1219
1220 debuglink_view_valid = 1;
1221 debuglink_data = (const char *) debuglink_view.data;
1222 crc_offset = strnlen (debuglink_data, shdr->sh_size);
1223 crc_offset = (crc_offset + 3) & ~3;
1224 if (crc_offset + 4 <= shdr->sh_size)
1225 {
1226 debuglink_name = debuglink_data;
1227 debuglink_crc = *(const uint32_t*)(debuglink_data + crc_offset);
1228 }
1229 }
1230 }
1231
1232 if (symtab_shndx == 0)
1233 symtab_shndx = dynsym_shndx;
1234 if (symtab_shndx != 0 && !debuginfo)
1235 {
1236 const b_elf_shdr *symtab_shdr;
1237 unsigned int strtab_shndx;
1238 const b_elf_shdr *strtab_shdr;
1239 struct elf_syminfo_data *sdata;
1240
1241 symtab_shdr = &shdrs[symtab_shndx - 1];
1242 strtab_shndx = symtab_shdr->sh_link;
1243 if (strtab_shndx >= shnum)
1244 {
1245 error_callback (data,
1246 "ELF symbol table strtab link out of range", 0);
1247 goto fail;
1248 }
1249 strtab_shdr = &shdrs[strtab_shndx - 1];
1250
1251 if (!backtrace_get_view (state, descriptor, symtab_shdr->sh_offset,
1252 symtab_shdr->sh_size, error_callback, data,
1253 &symtab_view))
1254 goto fail;
1255 symtab_view_valid = 1;
1256
1257 if (!backtrace_get_view (state, descriptor, strtab_shdr->sh_offset,
1258 strtab_shdr->sh_size, error_callback, data,
1259 &strtab_view))
1260 goto fail;
1261 strtab_view_valid = 1;
1262
1263 sdata = ((struct elf_syminfo_data *)
1264 backtrace_alloc (state, sizeof *sdata, error_callback, data));
1265 if (sdata == NULL)
1266 goto fail;
1267
1268 if (!elf_initialize_syminfo (state, base_address,
1269 symtab_view.data, symtab_shdr->sh_size,
1270 strtab_view.data, strtab_shdr->sh_size,
1271 error_callback, data, sdata))
1272 {
1273 backtrace_free (state, sdata, sizeof *sdata, error_callback, data);
1274 goto fail;
1275 }
1276
1277 /* We no longer need the symbol table, but we hold on to the
1278 string table permanently. */
1279 backtrace_release_view (state, &symtab_view, error_callback, data);
1280 symtab_view_valid = 0;
1281
1282 *found_sym = 1;
1283
1284 elf_add_syminfo_data (state, sdata);
1285 }
1286
1287 /* FIXME: Need to handle compressed debug sections. */
1288
1289 backtrace_release_view (state, &shdrs_view, error_callback, data);
1290 shdrs_view_valid = 0;
1291 backtrace_release_view (state, &names_view, error_callback, data);
1292 names_view_valid = 0;
1293
1294 /* If the debug info is in a separate file, read that one instead. */
1295
1296 if (buildid_data != NULL)
1297 {
1298 int d;
1299
1300 d = elf_open_debugfile_by_buildid (state, buildid_data, buildid_size,
1301 error_callback, data);
1302 if (d >= 0)
1303 {
1304 backtrace_release_view (state, &buildid_view, error_callback, data);
1305 if (debuglink_view_valid)
1306 backtrace_release_view (state, &debuglink_view, error_callback,
1307 data);
1308 return elf_add (state, NULL, d, base_address, error_callback, data,
1309 fileline_fn, found_sym, found_dwarf, 0, 1);
1310 }
1311 }
1312
1313 if (buildid_view_valid)
1314 {
1315 backtrace_release_view (state, &buildid_view, error_callback, data);
1316 buildid_view_valid = 0;
1317 }
1318
1319 if (debuglink_name != NULL)
1320 {
1321 int d;
1322
1323 d = elf_open_debugfile_by_debuglink (state, filename, debuglink_name,
1324 debuglink_crc, error_callback,
1325 data);
1326 if (d >= 0)
1327 {
1328 backtrace_release_view (state, &debuglink_view, error_callback,
1329 data);
1330 return elf_add (state, NULL, d, base_address, error_callback, data,
1331 fileline_fn, found_sym, found_dwarf, 0, 1);
1332 }
1333 }
1334
1335 if (debuglink_view_valid)
1336 {
1337 backtrace_release_view (state, &debuglink_view, error_callback, data);
1338 debuglink_view_valid = 0;
1339 }
1340
1341 /* Read all the debug sections in a single view, since they are
1342 probably adjacent in the file. We never release this view. */
1343
1344 min_offset = 0;
1345 max_offset = 0;
1346 for (i = 0; i < (int) DEBUG_MAX; ++i)
1347 {
1348 off_t end;
1349
1350 if (sections[i].size == 0)
1351 continue;
1352 if (min_offset == 0 || sections[i].offset < min_offset)
1353 min_offset = sections[i].offset;
1354 end = sections[i].offset + sections[i].size;
1355 if (end > max_offset)
1356 max_offset = end;
1357 }
1358 if (min_offset == 0 || max_offset == 0)
1359 {
1360 if (!backtrace_close (descriptor, error_callback, data))
1361 goto fail;
1362 return 1;
1363 }
1364
1365 if (!backtrace_get_view (state, descriptor, min_offset,
1366 max_offset - min_offset,
1367 error_callback, data, &debug_view))
1368 goto fail;
1369 debug_view_valid = 1;
1370
1371 /* We've read all we need from the executable. */
1372 if (!backtrace_close (descriptor, error_callback, data))
1373 goto fail;
1374 descriptor = -1;
1375
1376 for (i = 0; i < (int) DEBUG_MAX; ++i)
1377 {
1378 if (sections[i].size == 0)
1379 sections[i].data = NULL;
1380 else
1381 sections[i].data = ((const unsigned char *) debug_view.data
1382 + (sections[i].offset - min_offset));
1383 }
1384
1385 if (!backtrace_dwarf_add (state, base_address,
1386 sections[DEBUG_INFO].data,
1387 sections[DEBUG_INFO].size,
1388 sections[DEBUG_LINE].data,
1389 sections[DEBUG_LINE].size,
1390 sections[DEBUG_ABBREV].data,
1391 sections[DEBUG_ABBREV].size,
1392 sections[DEBUG_RANGES].data,
1393 sections[DEBUG_RANGES].size,
1394 sections[DEBUG_STR].data,
1395 sections[DEBUG_STR].size,
1396 ehdr.e_ident[EI_DATA] == ELFDATA2MSB,
1397 error_callback, data, fileline_fn))
1398 goto fail;
1399
1400 *found_dwarf = 1;
1401
1402 return 1;
1403
1404 fail:
1405 if (shdrs_view_valid)
1406 backtrace_release_view (state, &shdrs_view, error_callback, data);
1407 if (names_view_valid)
1408 backtrace_release_view (state, &names_view, error_callback, data);
1409 if (symtab_view_valid)
1410 backtrace_release_view (state, &symtab_view, error_callback, data);
1411 if (strtab_view_valid)
1412 backtrace_release_view (state, &strtab_view, error_callback, data);
1413 if (debuglink_view_valid)
1414 backtrace_release_view (state, &debuglink_view, error_callback, data);
1415 if (buildid_view_valid)
1416 backtrace_release_view (state, &buildid_view, error_callback, data);
1417 if (debug_view_valid)
1418 backtrace_release_view (state, &debug_view, error_callback, data);
1419 if (descriptor != -1)
1420 backtrace_close (descriptor, error_callback, data);
1421 return 0;
1422 }
1423
1424 /* Data passed to phdr_callback. */
1425
1426 struct phdr_data
1427 {
1428 struct backtrace_state *state;
1429 backtrace_error_callback error_callback;
1430 void *data;
1431 fileline *fileline_fn;
1432 int *found_sym;
1433 int *found_dwarf;
1434 const char *exe_filename;
1435 int exe_descriptor;
1436 };
1437
1438 /* Callback passed to dl_iterate_phdr. Load debug info from shared
1439 libraries. */
1440
1441 static int
1442 #ifdef __i386__
1443 __attribute__ ((__force_align_arg_pointer__))
1444 #endif
1445 phdr_callback (struct dl_phdr_info *info, size_t size ATTRIBUTE_UNUSED,
1446 void *pdata)
1447 {
1448 struct phdr_data *pd = (struct phdr_data *) pdata;
1449 const char *filename;
1450 int descriptor;
1451 int does_not_exist;
1452 fileline elf_fileline_fn;
1453 int found_dwarf;
1454
1455 /* There is not much we can do if we don't have the module name,
1456 unless executable is ET_DYN, where we expect the very first
1457 phdr_callback to be for the PIE. */
1458 if (info->dlpi_name == NULL || info->dlpi_name[0] == '\0')
1459 {
1460 if (pd->exe_descriptor == -1)
1461 return 0;
1462 filename = pd->exe_filename;
1463 descriptor = pd->exe_descriptor;
1464 pd->exe_descriptor = -1;
1465 }
1466 else
1467 {
1468 if (pd->exe_descriptor != -1)
1469 {
1470 backtrace_close (pd->exe_descriptor, pd->error_callback, pd->data);
1471 pd->exe_descriptor = -1;
1472 }
1473
1474 filename = info->dlpi_name;
1475 descriptor = backtrace_open (info->dlpi_name, pd->error_callback,
1476 pd->data, &does_not_exist);
1477 if (descriptor < 0)
1478 return 0;
1479 }
1480
1481 if (elf_add (pd->state, filename, descriptor, info->dlpi_addr,
1482 pd->error_callback, pd->data, &elf_fileline_fn, pd->found_sym,
1483 &found_dwarf, 0, 0))
1484 {
1485 if (found_dwarf)
1486 {
1487 *pd->found_dwarf = 1;
1488 *pd->fileline_fn = elf_fileline_fn;
1489 }
1490 }
1491
1492 return 0;
1493 }
1494
1495 /* Initialize the backtrace data we need from an ELF executable. At
1496 the ELF level, all we need to do is find the debug info
1497 sections. */
1498
1499 int
1500 backtrace_initialize (struct backtrace_state *state, const char *filename,
1501 int descriptor, backtrace_error_callback error_callback,
1502 void *data, fileline *fileline_fn)
1503 {
1504 int ret;
1505 int found_sym;
1506 int found_dwarf;
1507 fileline elf_fileline_fn = elf_nodebug;
1508 struct phdr_data pd;
1509
1510 ret = elf_add (state, filename, descriptor, 0, error_callback, data,
1511 &elf_fileline_fn, &found_sym, &found_dwarf, 1, 0);
1512 if (!ret)
1513 return 0;
1514
1515 pd.state = state;
1516 pd.error_callback = error_callback;
1517 pd.data = data;
1518 pd.fileline_fn = &elf_fileline_fn;
1519 pd.found_sym = &found_sym;
1520 pd.found_dwarf = &found_dwarf;
1521 pd.exe_filename = filename;
1522 pd.exe_descriptor = ret < 0 ? descriptor : -1;
1523
1524 dl_iterate_phdr (phdr_callback, (void *) &pd);
1525
1526 if (!state->threaded)
1527 {
1528 if (found_sym)
1529 state->syminfo_fn = elf_syminfo;
1530 else if (state->syminfo_fn == NULL)
1531 state->syminfo_fn = elf_nosyms;
1532 }
1533 else
1534 {
1535 if (found_sym)
1536 backtrace_atomic_store_pointer (&state->syminfo_fn, elf_syminfo);
1537 else
1538 (void) __sync_bool_compare_and_swap (&state->syminfo_fn, NULL,
1539 elf_nosyms);
1540 }
1541
1542 if (!state->threaded)
1543 *fileline_fn = state->fileline_fn;
1544 else
1545 *fileline_fn = backtrace_atomic_load_pointer (&state->fileline_fn);
1546
1547 if (*fileline_fn == NULL || *fileline_fn == elf_nodebug)
1548 *fileline_fn = elf_fileline_fn;
1549
1550 return 1;
1551 }