1 /* Internal definitions for libdw.
2 Copyright (C) 2002-2011, 2013-2018 Red Hat, Inc.
3 This file is part of elfutils.
5 This file is free software; you can redistribute it and/or modify
6 it under the terms of either
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
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
18 or both in parallel, as here.
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.
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/>. */
39 /* gettext helper macros. */
40 #define _(Str) dgettext ("elfutils", Str)
43 /* Known location expressions already decoded. */
51 /* Known DW_OP_implicit_value blocks already decoded.
52 This overlaps struct loc_s exactly, but only the
53 first member really has to match. */
61 /* Already decoded .debug_line units. */
64 Dwarf_Off debug_line_offset;
69 /* Valid indeces for the section data. */
84 IDX_debug_str_offsets,
98 DWARF_E_UNKNOWN_ERROR,
99 DWARF_E_INVALID_ACCESS,
104 DWARF_E_COMPRESSED_ERROR,
106 DWARF_E_GETEHDR_ERROR,
110 DWARF_E_INVALID_VERSION,
111 DWARF_E_INVALID_FILE,
113 DWARF_E_INVALID_DWARF,
115 DWARF_E_NO_DEBUG_STR,
116 DWARF_E_NO_DEBUG_LINE_STR,
117 DWARF_E_NO_STR_OFFSETS,
120 DWARF_E_NO_REFERENCE,
121 DWARF_E_INVALID_REFERENCE,
122 DWARF_E_NO_DEBUG_LINE,
123 DWARF_E_INVALID_DEBUG_LINE,
126 DWARF_E_INVALID_DIR_IDX,
127 DWARF_E_ADDR_OUTOFRANGE,
128 DWARF_E_NO_DEBUG_LOC,
129 DWARF_E_NO_DEBUG_LOCLISTS,
130 DWARF_E_NO_LOC_VALUE,
132 DWARF_E_INVALID_LINE_IDX,
133 DWARF_E_INVALID_ARANGE_IDX,
136 DWARF_E_INVALID_OFFSET,
137 DWARF_E_NO_DEBUG_RANGES,
138 DWARF_E_NO_DEBUG_RNGLISTS,
140 DWARF_E_NO_ALT_DEBUGLINK,
141 DWARF_E_INVALID_OPCODE,
143 DWARF_E_UNKNOWN_LANGUAGE,
144 DWARF_E_NO_DEBUG_ADDR,
148 #include "dwarf_sig8_hash.h"
150 /* This is the structure representing the debugging state. */
153 /* The underlying ELF file. */
156 /* The (absolute) path to the ELF dir, if known. To help locating
157 alt and dwo files. */
160 /* dwz alternate DWARF file. */
163 /* The section data. */
164 Elf_Data *sectiondata[IDX_last];
166 /* True if the file has a byte order different from the host. */
167 bool other_byte_order;
169 /* If true, we allocated the ELF descriptor ourselves. */
172 /* If >= 0, we allocated the alt_dwarf ourselves and must end it and
173 close this file descriptor. */
176 /* Information for traversing the .debug_pubnames section. This is
177 an array and separately allocated with malloc. */
182 unsigned int cu_header_size;
185 size_t pubnames_nsets;
187 /* Search tree for the CUs. */
189 Dwarf_Off next_cu_offset;
191 /* Search tree and sig8 hash table for .debug_types type units. */
193 Dwarf_Off next_tu_offset;
194 Dwarf_Sig8_Hash sig8_hash;
196 /* Search tree for split Dwarf associated with CUs in this debug. */
199 /* Search tree for .debug_macro operator tables. */
202 /* Search tree for decoded .debug_line units. */
205 /* Address ranges. */
206 Dwarf_Aranges *aranges;
208 /* Cached info from the CFI section. */
209 struct Dwarf_CFI_s *cfi;
211 /* Fake loc CU. Used when synthesizing attributes for Dwarf_Ops that
212 came from a location list entry in dwarf_getlocation_attr.
213 Depending on version this is the .debug_loc or .debug_loclists
214 section (could be both if mixing CUs with different DWARF versions). */
215 struct Dwarf_CU *fake_loc_cu;
216 struct Dwarf_CU *fake_loclists_cu;
218 /* Similar for addrx/constx, which will come from .debug_addr section. */
219 struct Dwarf_CU *fake_addr_cu;
221 /* Internal memory handling. This is basically a simplified
222 reimplementation of obstacks. Unfortunately the standard obstack
223 implementation is not usable in libraries. */
224 struct libdw_memblock
228 struct libdw_memblock *prev;
232 /* Default size of allocated memory blocks. */
233 size_t mem_default_size;
235 /* Registered OOM handler. */
236 Dwarf_OOM oom_handler;
240 /* Abbreviation representation. */
243 Dwarf_Off offset; /* Offset to start of abbrev into .debug_abbrev. */
244 unsigned char *attrp; /* Pointer to start of attribute name/form pairs. */
245 bool has_children : 1; /* Whether or not the DIE has children. */
246 unsigned int code : 31; /* The (unique) abbrev code. */
247 unsigned int tag; /* The tag of the DIE. */
250 #include "dwarf_abbrev_hash.h"
253 /* Files in line information records. */
258 struct Dwarf_Fileinfo_s
264 /* nfiles of those, followed by char *[ndirs]. */
266 typedef struct Dwarf_Fileinfo_s Dwarf_Fileinfo;
269 /* Representation of a row in the line table. */
278 unsigned short int column;
279 unsigned int is_stmt:1;
280 unsigned int basic_block:1;
281 unsigned int end_sequence:1;
282 unsigned int prologue_end:1;
283 unsigned int epilogue_begin:1;
284 /* The remaining bit fields are not flags, but hold values presumed to be
285 small. All the flags and other bit fields should add up to 48 bits
286 to give the whole struct a nice round size. */
287 unsigned int op_index:8;
289 unsigned int discriminator:24;
295 struct Dwarf_Line_s info[0];
298 /* Representation of address ranges. */
299 struct Dwarf_Aranges_s
304 struct Dwarf_Arange_s
313 /* CU representation. */
319 uint8_t address_size;
323 size_t sec_idx; /* Normally .debug_info, could be .debug_type or "fake". */
325 /* The unit type if version >= 5. Otherwise 0 for normal CUs (from
326 .debug_info) or 1 for v4 type units (from .debug_types). */
329 /* Zero if the unit type doesn't support a die/type offset and/or id/sig.
330 Nonzero if it is a v4 type unit or for DWARFv5 units depending on
332 size_t subdie_offset;
335 /* If this is a skeleton unit this points to the split compile unit.
336 Or the other way around if this is a split compile unit. Set to -1
337 if not yet searched. Always use __libdw_find_split_unit to access
339 struct Dwarf_CU *split;
341 /* Hash table for the abbreviations. */
342 Dwarf_Abbrev_Hash abbrev_hash;
343 /* Offset of the first abbreviation. */
344 size_t orig_abbrev_offset;
345 /* Offset past last read abbreviation. */
346 size_t last_abbrev_offset;
348 /* The srcline information. */
351 /* The source file information. */
354 /* Known location lists. */
357 /* Base address for use with ranges and locs.
358 Don't access directly, call __libdw_cu_base_address. */
359 Dwarf_Addr base_address;
361 /* The offset into the .debug_addr section where index zero begins.
362 Don't access directly, call __libdw_cu_addr_base. */
365 /* The offset into the .debug_str_offsets section where index zero begins.
366 Don't access directly, call __libdw_cu_str_off_base. */
367 Dwarf_Off str_off_base;
369 /* The offset into the .debug_ranges section to use for GNU
370 DebugFission split units. Don't access directly, call
371 __libdw_cu_ranges_base. */
372 Dwarf_Off ranges_base;
374 /* The start of the offset table in .debug_loclists.
375 Don't access directly, call __libdw_cu_locs_base. */
378 /* Memory boundaries of this CU. */
383 #define ISV4TU(cu) ((cu)->version == 4 && (cu)->sec_idx == IDX_debug_types)
385 /* Compute the offset of a CU's first DIE from the CU offset.
386 CU must be a valid/known version/unit_type. */
387 static inline Dwarf_Off
388 __libdw_first_die_from_cu_start (Dwarf_Off cu_start,
394 assert (offset_size == 4 || offset_size == 8);
395 assert (version >= 2 && version <= 5);
396 assert (unit_type == DW_UT_compile
397 || unit_type == DW_UT_partial
398 || unit_type == DW_UT_skeleton
399 || unit_type == DW_UT_split_compile
400 || unit_type == DW_UT_type
401 || unit_type == DW_UT_split_type);
404 Dwarf_Off off = cu_start;
409 4-bytes + 2-bytes + 4-bytes + 1-byte for 32-bit dwarf
410 12-bytes + 2-bytes + 8-bytes + 1-byte for 64-bit dwarf
411 or in .debug_types, SIGNATURE TYPE-OFFSET
412 4-bytes + 2-bytes + 4-bytes + 1-byte + 8-bytes + 4-bytes for 32-bit
413 12-bytes + 2-bytes + 8-bytes + 1-byte + 8-bytes + 8-bytes for 64-bit
415 Note the trick in the computation. If the offset_size is 4
416 the '- 4' term changes the '3 *' (or '4 *') into a '2 *' (or '3 *).
417 If the offset_size is 8 it accounts for the 4-byte escape value
418 used at the start of the length. */
419 if (unit_type != DW_UT_type)
420 off += 3 * offset_size - 4 + 3;
422 off += 4 * offset_size - 4 + 3 + 8;
427 LEN VER TYPE ADDR OFFSET SIGNATURE TYPE-OFFSET
428 4-bytes + 2-bytes + 1-byte + 1-byte + 4-bytes + 8-bytes + 4-bytes 32-bit
429 12-bytes + 2-bytes + 1-byte + 1-byte + 8-bytes + 8-bytes + 8-bytes 64-bit
430 Both signature and type offset are optional.
432 Note same 4/8 offset size trick as above.
433 We explicitly ignore unknow unit types (see asserts above). */
434 off += 3 * offset_size - 4 + 4;
435 if (unit_type == DW_UT_skeleton || unit_type == DW_UT_split_compile
436 || unit_type == DW_UT_type || unit_type == DW_UT_split_type)
439 if (unit_type == DW_UT_type || unit_type == DW_UT_split_type)
447 static inline Dwarf_Off
448 __libdw_first_die_off_from_cu (struct Dwarf_CU *cu)
450 return __libdw_first_die_from_cu_start (cu->start,
456 #define CUDIE(fromcu) \
460 .addr = ((char *) (fromcu)->dbg->sectiondata[cu_sec_idx (fromcu)]->d_buf \
461 + __libdw_first_die_off_from_cu (fromcu)) \
464 #define SUBDIE(fromcu) \
468 .addr = ((char *) (fromcu)->dbg->sectiondata[cu_sec_idx (fromcu)]->d_buf \
469 + (fromcu)->start + (fromcu)->subdie_offset) \
473 /* Prototype of a single .debug_macro operator. */
477 unsigned char const *forms;
478 } Dwarf_Macro_Op_Proto;
480 /* Prototype table. */
483 /* Offset of .debug_macro section. */
486 /* Offset of associated .debug_line section. */
487 Dwarf_Off line_offset;
489 /* The source file information. */
492 /* If this macro unit was opened through dwarf_getmacros or
493 dwarf_getmacros_die, this caches value of DW_AT_comp_dir, if
495 const char *comp_dir;
498 Dwarf_Half header_len;
502 uint8_t sec_index; /* IDX_debug_macro or IDX_debug_macinfo. */
504 /* Shows where in TABLE each opcode is defined. Since opcode 0 is
505 never used, it stores index of opcode X in X-1'th element. The
506 value of 0xff means not stored at all. */
507 unsigned char opcodes[255];
509 /* Individual opcode prototypes. */
510 Dwarf_Macro_Op_Proto table[];
511 } Dwarf_Macro_Op_Table;
515 Dwarf_Macro_Op_Table *table;
516 Dwarf_Attribute *attributes;
520 static inline Dwarf_Word
521 libdw_macro_nforms (Dwarf_Macro *macro)
523 return macro->table->table[macro->table->opcodes[macro->opcode - 1]].nforms;
526 /* Returns true for any allowed FORM in the opcode_operands_table as
527 mentioned in the DWARF5 spec (6.3.1 Macro Information Header).
528 Or those mentioned in DWARF5 spec (6.2.4.2 Vendor-defined Content
529 Descriptions) for the directory/file table (plus DW_FORM_strp_sup). */
531 libdw_valid_user_form (int form)
545 case DW_FORM_line_strp:
547 case DW_FORM_sec_offset:
550 case DW_FORM_strp_sup:
564 /* We have to include the file at this point because the inline
565 functions access internals of the Dwarf structure. */
566 #include "memory-access.h"
569 /* Set error value. */
570 extern void __libdw_seterrno (int value) internal_function;
573 /* Memory handling, the easy parts. This macro does not do any locking. */
574 #define libdw_alloc(dbg, type, tsize, cnt) \
575 ({ struct libdw_memblock *_tail = (dbg)->mem_tail; \
576 size_t _required = (tsize) * (cnt); \
577 type *_result = (type *) (_tail->mem + (_tail->size - _tail->remaining));\
578 size_t _padding = ((__alignof (type) \
579 - ((uintptr_t) _result & (__alignof (type) - 1))) \
580 & (__alignof (type) - 1)); \
581 if (unlikely (_tail->remaining < _required + _padding)) \
582 _result = (type *) __libdw_allocate (dbg, _required, __alignof (type));\
585 _required += _padding; \
586 _result = (type *) ((char *) _result + _padding); \
587 _tail->remaining -= _required; \
591 #define libdw_typed_alloc(dbg, type) \
592 libdw_alloc (dbg, type, sizeof (type), 1)
594 /* Callback to allocate more. */
595 extern void *__libdw_allocate (Dwarf *dbg, size_t minsize, size_t align)
596 __attribute__ ((__malloc__)) __nonnull_attribute__ (1);
598 /* Default OOM handler. */
599 extern void __libdw_oom (void) __attribute ((noreturn)) attribute_hidden;
601 /* Read next unit (or v4 debug type) and return next offset. Doesn't
602 create an actual Dwarf_CU just provides necessary header fields. */
605 __libdw_next_unit (Dwarf *dbg, bool v4_debug_types, Dwarf_Off off,
606 Dwarf_Off *next_off, size_t *header_sizep,
607 Dwarf_Half *versionp, uint8_t *unit_typep,
608 Dwarf_Off *abbrev_offsetp, uint8_t *address_sizep,
609 uint8_t *offset_sizep, uint64_t *unit_id8p,
610 Dwarf_Off *subdie_offsetp)
611 __nonnull_attribute__ (4) internal_function;
613 /* Allocate the internal data for a unit not seen before. */
614 extern struct Dwarf_CU *__libdw_intern_next_unit (Dwarf *dbg, bool debug_types)
615 __nonnull_attribute__ (1) internal_function;
617 /* Find CU for given offset. */
618 extern struct Dwarf_CU *__libdw_findcu (Dwarf *dbg, Dwarf_Off offset, bool tu)
619 __nonnull_attribute__ (1) internal_function;
621 /* Find CU for given DIE address. */
622 extern struct Dwarf_CU *__libdw_findcu_addr (Dwarf *dbg, void *addr)
623 __nonnull_attribute__ (1) internal_function;
625 /* Find split Dwarf for given DIE address. */
626 extern struct Dwarf *__libdw_find_split_dbg_addr (Dwarf *dbg, void *addr)
627 __nonnull_attribute__ (1) internal_function;
629 /* Find the split (or skeleton) unit. */
630 extern struct Dwarf_CU *__libdw_find_split_unit (Dwarf_CU *cu)
633 /* Get abbreviation with given code. */
634 extern Dwarf_Abbrev *__libdw_findabbrev (struct Dwarf_CU *cu,
636 __nonnull_attribute__ (1) internal_function;
638 /* Get abbreviation at given offset. */
639 extern Dwarf_Abbrev *__libdw_getabbrev (Dwarf *dbg, struct Dwarf_CU *cu,
640 Dwarf_Off offset, size_t *lengthp,
641 Dwarf_Abbrev *result)
642 __nonnull_attribute__ (1) internal_function;
644 /* Get abbreviation of given DIE, and optionally set *READP to the DIE memory
645 just past the abbreviation code. */
646 static inline Dwarf_Abbrev *
647 __nonnull_attribute__ (1)
648 __libdw_dieabbrev (Dwarf_Die *die, const unsigned char **readp)
650 /* Do we need to get the abbreviation, or need to read after the code? */
651 if (die->abbrev == NULL || readp != NULL)
653 /* Get the abbreviation code. */
655 const unsigned char *addr = die->addr;
656 if (unlikely (die->cu == NULL
657 || addr >= (const unsigned char *) die->cu->endp))
658 return die->abbrev = DWARF_END_ABBREV;
659 get_uleb128 (code, addr, die->cu->endp);
663 /* Find the abbreviation. */
664 if (die->abbrev == NULL)
665 die->abbrev = __libdw_findabbrev (die->cu, code);
670 /* Helper functions for form handling. */
671 extern size_t __libdw_form_val_compute_len (struct Dwarf_CU *cu,
673 const unsigned char *valp)
674 __nonnull_attribute__ (1, 3) internal_function;
676 /* Find the length of a form attribute in DIE/info data. */
678 __nonnull_attribute__ (1, 3)
679 __libdw_form_val_len (struct Dwarf_CU *cu, unsigned int form,
680 const unsigned char *valp)
682 /* Small lookup table of forms with fixed lengths. Absent indexes are
683 initialized 0, so any truly desired 0 is set to 0x80 and masked. */
684 static const uint8_t form_lengths[] =
686 [DW_FORM_flag_present] = 0x80,
687 [DW_FORM_implicit_const] = 0x80, /* Value is in abbrev, not in info. */
690 [DW_FORM_data1] = 1, [DW_FORM_ref1] = 1,
691 [DW_FORM_addrx1] = 1, [DW_FORM_strx1] = 1,
693 [DW_FORM_data2] = 2, [DW_FORM_ref2] = 2,
694 [DW_FORM_addrx2] = 2, [DW_FORM_strx2] = 2,
696 [DW_FORM_addrx3] = 3, [DW_FORM_strx3] = 3,
698 [DW_FORM_data4] = 4, [DW_FORM_ref4] = 4, [DW_FORM_ref_sup4] = 4,
699 [DW_FORM_addrx4] = 4, [DW_FORM_strx4] = 4,
701 [DW_FORM_ref_sig8] = 8,
702 [DW_FORM_data8] = 8, [DW_FORM_ref8] = 8, [DW_FORM_ref_sup8] = 8,
704 [DW_FORM_data16] = 16,
707 /* Return immediately for forms with fixed lengths. */
708 if (form < sizeof form_lengths / sizeof form_lengths[0])
710 uint8_t len = form_lengths[form];
713 const unsigned char *endp = cu->endp;
714 len &= 0x7f; /* Mask to allow 0x80 -> 0. */
715 if (unlikely (len > (size_t) (endp - valp)))
717 __libdw_seterrno (DWARF_E_INVALID_DWARF);
724 /* Other forms require some computation. */
725 return __libdw_form_val_compute_len (cu, form, valp);
728 /* Helper function for DW_FORM_ref* handling. */
729 extern int __libdw_formref (Dwarf_Attribute *attr, Dwarf_Off *return_offset)
730 __nonnull_attribute__ (1, 2) internal_function;
733 /* Helper function to locate attribute. */
734 extern unsigned char *__libdw_find_attr (Dwarf_Die *die,
735 unsigned int search_name,
738 __nonnull_attribute__ (1) internal_function;
740 /* Helper function to access integer attribute. */
741 extern int __libdw_attr_intval (Dwarf_Die *die, int *valp, int attval)
742 __nonnull_attribute__ (1, 2) internal_function;
744 /* Helper function to walk scopes. */
745 struct Dwarf_Die_Chain
748 struct Dwarf_Die_Chain *parent;
749 bool prune; /* The PREVISIT function can set this. */
751 extern int __libdw_visit_scopes (unsigned int depth,
752 struct Dwarf_Die_Chain *root,
753 struct Dwarf_Die_Chain *imports,
754 int (*previsit) (unsigned int depth,
755 struct Dwarf_Die_Chain *,
757 int (*postvisit) (unsigned int depth,
758 struct Dwarf_Die_Chain *,
761 __nonnull_attribute__ (2, 4) internal_function;
763 /* Parse a DWARF Dwarf_Block into an array of Dwarf_Op's,
764 and cache the result (via tsearch). */
765 extern int __libdw_intern_expression (Dwarf *dbg,
766 bool other_byte_order,
767 unsigned int address_size,
768 unsigned int ref_size,
769 void **cache, const Dwarf_Block *block,
770 bool cfap, bool valuep,
771 Dwarf_Op **llbuf, size_t *listlen,
773 __nonnull_attribute__ (5, 6, 9, 10) internal_function;
775 extern Dwarf_Die *__libdw_offdie (Dwarf *dbg, Dwarf_Off offset,
776 Dwarf_Die *result, bool debug_types)
780 /* Return error code of last failing function call. This value is kept
781 separately for each thread. */
782 extern int __dwarf_errno_internal (void);
787 /* Relocation hooks return -1 on error (in that case the error code
788 must already have been set), 0 if there is no relocation and 1 if a
789 relocation was present.*/
792 __libdw_relocate_address (Dwarf *dbg __attribute__ ((unused)),
793 int sec_index __attribute__ ((unused)),
794 const void *addr __attribute__ ((unused)),
795 int width __attribute__ ((unused)),
796 Dwarf_Addr *val __attribute__ ((unused)))
802 __libdw_relocate_offset (Dwarf *dbg __attribute__ ((unused)),
803 int sec_index __attribute__ ((unused)),
804 const void *addr __attribute__ ((unused)),
805 int width __attribute__ ((unused)),
806 Dwarf_Off *val __attribute__ ((unused)))
811 static inline Elf_Data *
812 __libdw_checked_get_data (Dwarf *dbg, int sec_index)
814 Elf_Data *data = dbg->sectiondata[sec_index];
815 if (unlikely (data == NULL)
816 || unlikely (data->d_buf == NULL))
818 __libdw_seterrno (DWARF_E_INVALID_DWARF);
825 __libdw_offset_in_section (Dwarf *dbg, int sec_index,
826 Dwarf_Off offset, size_t size)
828 Elf_Data *data = __libdw_checked_get_data (dbg, sec_index);
831 if (unlikely (offset > data->d_size)
832 || unlikely (data->d_size < size)
833 || unlikely (offset > data->d_size - size))
835 __libdw_seterrno (DWARF_E_INVALID_OFFSET);
843 __libdw_in_section (Dwarf *dbg, int sec_index,
844 const void *addr, size_t size)
846 Elf_Data *data = __libdw_checked_get_data (dbg, sec_index);
849 if (unlikely (addr < data->d_buf)
850 || unlikely (data->d_size < size)
851 || unlikely ((size_t)(addr - data->d_buf) > data->d_size - size))
853 __libdw_seterrno (DWARF_E_INVALID_OFFSET);
860 #define READ_AND_RELOCATE(RELOC_HOOK, VAL) \
862 if (!__libdw_in_section (dbg, sec_index, addr, width)) \
865 const unsigned char *orig_addr = addr; \
867 VAL = read_4ubyte_unaligned_inc (dbg, addr); \
869 VAL = read_8ubyte_unaligned_inc (dbg, addr); \
871 int status = RELOC_HOOK (dbg, sec_index, orig_addr, width, &VAL); \
878 __libdw_read_address_inc (Dwarf *dbg,
879 int sec_index, const unsigned char **addrp,
880 int width, Dwarf_Addr *ret)
882 const unsigned char *addr = *addrp;
883 READ_AND_RELOCATE (__libdw_relocate_address, (*ret));
889 __libdw_read_address (Dwarf *dbg,
890 int sec_index, const unsigned char *addr,
891 int width, Dwarf_Addr *ret)
893 READ_AND_RELOCATE (__libdw_relocate_address, (*ret));
898 __libdw_read_offset_inc (Dwarf *dbg,
899 int sec_index, const unsigned char **addrp,
900 int width, Dwarf_Off *ret, int sec_ret,
903 const unsigned char *addr = *addrp;
904 READ_AND_RELOCATE (__libdw_relocate_offset, (*ret));
906 return __libdw_offset_in_section (dbg, sec_ret, *ret, size);
910 __libdw_read_offset (Dwarf *dbg, Dwarf *dbg_ret,
911 int sec_index, const unsigned char *addr,
912 int width, Dwarf_Off *ret, int sec_ret,
915 READ_AND_RELOCATE (__libdw_relocate_offset, (*ret));
916 return __libdw_offset_in_section (dbg_ret, sec_ret, *ret, size);
920 cu_sec_idx (struct Dwarf_CU *cu)
926 is_cudie (Dwarf_Die *cudie)
928 return cudie->cu != NULL && CUDIE (cudie->cu).addr == cudie->addr;
931 /* Read up begin/end pair and increment read pointer.
932 - If it's normal range record, set up *BEGINP and *ENDP and return 0.
933 - If it's base address selection record, set up *BASEP and return 1.
934 - If it's end of rangelist, don't set anything and return 2
935 - If an error occurs, don't set anything and return <0. */
936 int __libdw_read_begin_end_pair_inc (Dwarf_CU *cu, int sec_index,
937 const unsigned char **readp,
938 const unsigned char *readend,
940 Dwarf_Addr *beginp, Dwarf_Addr *endp,
944 const unsigned char * __libdw_formptr (Dwarf_Attribute *attr, int sec_index,
946 const unsigned char **endpp,
950 /* Fills in the given attribute to point at an empty location expression. */
951 void __libdw_empty_loc_attr (Dwarf_Attribute *attr)
954 /* Load .debug_line unit at DEBUG_LINE_OFFSET. COMP_DIR is a value of
955 DW_AT_comp_dir or NULL if that attribute is not available. Caches
956 the loaded unit and optionally set *LINESP and/or *FILESP (if not
957 NULL) with loaded information. Returns 0 for success or a negative
958 value for failure. */
959 int __libdw_getsrclines (Dwarf *dbg, Dwarf_Off debug_line_offset,
960 const char *comp_dir, unsigned address_size,
961 Dwarf_Lines **linesp, Dwarf_Files **filesp)
963 __nonnull_attribute__ (1);
965 /* Load and return value of DW_AT_comp_dir from CUDIE. */
966 const char *__libdw_getcompdir (Dwarf_Die *cudie);
968 /* Get the base address for the CU, fetches it when not yet set.
969 This is used as initial base address for ranges and loclists. */
970 Dwarf_Addr __libdw_cu_base_address (Dwarf_CU *cu);
972 /* Get the address base for the CU, fetches it when not yet set. */
973 static inline Dwarf_Off
974 __libdw_cu_addr_base (Dwarf_CU *cu)
976 if (cu->addr_base == (Dwarf_Off) -1)
978 Dwarf_Die cu_die = CUDIE(cu);
979 Dwarf_Attribute attr;
980 Dwarf_Off offset = 0;
981 if (dwarf_attr (&cu_die, DW_AT_GNU_addr_base, &attr) != NULL
982 || dwarf_attr (&cu_die, DW_AT_addr_base, &attr) != NULL)
985 if (dwarf_formudata (&attr, &off) == 0)
988 cu->addr_base = offset;
991 return cu->addr_base;
994 /* Gets the .debug_str_offsets base offset to use. static inline to
995 be shared between libdw and eu-readelf. */
996 static inline Dwarf_Off
997 str_offsets_base_off (Dwarf *dbg, Dwarf_CU *cu)
999 /* If we don't have a CU, then find and use the first one in the
1000 debug file (when we support .dwp files, we must actually find the
1001 one matching our "caller" - aka macro or line). If we (now) have
1002 a cu and str_offsets_base attribute, just use that. Otherwise
1003 use the first offset. But we might have to parse the header
1004 first, but only if this is version 5. Assume if all else fails,
1005 this is version 4, without header. */
1007 if (cu == NULL && dbg != NULL)
1010 if (dwarf_get_units (dbg, NULL, &first_cu,
1011 NULL, NULL, NULL, NULL) == 0)
1017 if (cu->str_off_base == (Dwarf_Off) -1)
1019 Dwarf_Die cu_die = CUDIE(cu);
1020 Dwarf_Attribute attr;
1021 if (dwarf_attr (&cu_die, DW_AT_str_offsets_base, &attr) != NULL)
1024 if (dwarf_formudata (&attr, &off) == 0)
1026 cu->str_off_base = off;
1027 return cu->str_off_base;
1030 /* For older DWARF simply assume zero (no header). */
1031 if (cu->version < 5)
1033 cu->str_off_base = 0;
1034 return cu->str_off_base;
1041 return cu->str_off_base;
1044 /* No str_offsets_base attribute, we have to assume "zero".
1045 But there could be a header first. */
1050 Elf_Data *data = dbg->sectiondata[IDX_debug_str_offsets];
1054 const unsigned char *start;
1055 const unsigned char *readp;
1056 const unsigned char *readendp;
1057 start = readp = (const unsigned char *) data->d_buf;
1058 readendp = (const unsigned char *) data->d_buf + data->d_size;
1060 uint64_t unit_length;
1063 unit_length = read_4ubyte_unaligned_inc (dbg, readp);
1064 if (unlikely (unit_length == 0xffffffff))
1066 if (unlikely (readendp - readp < 8))
1068 unit_length = read_8ubyte_unaligned_inc (dbg, readp);
1069 /* In theory the offset size could be different
1070 between CU and str_offsets unit. But we just
1071 ignore that here. */
1074 /* We need at least 2-bytes (version) + 2-bytes (padding) =
1075 4 bytes to complete the header. And this unit cannot go
1076 beyond the section data. */
1077 if (readendp - readp < 4
1079 || (uint64_t) (readendp - readp) < unit_length)
1082 version = read_2ubyte_unaligned_inc (dbg, readp);
1086 read_2ubyte_unaligned_inc (dbg, readp);
1088 off = (Dwarf_Off) (readp - start);
1092 cu->str_off_base = off;
1098 /* Get the string offsets base for the CU, fetches it when not yet set. */
1099 static inline Dwarf_Off __libdw_cu_str_off_base (Dwarf_CU *cu)
1101 return str_offsets_base_off (NULL, cu);
1105 /* Either a direct offset into .debug_ranges for version < 5, or the
1106 start of the offset table in .debug_rnglists for version > 5. */
1107 static inline Dwarf_Off
1108 __libdw_cu_ranges_base (Dwarf_CU *cu)
1110 if (cu->ranges_base == (Dwarf_Off) -1)
1112 Dwarf_Off offset = 0;
1113 Dwarf_Die cu_die = CUDIE(cu);
1114 Dwarf_Attribute attr;
1115 if (cu->version < 5)
1117 if (dwarf_attr (&cu_die, DW_AT_GNU_ranges_base, &attr) != NULL)
1120 if (dwarf_formudata (&attr, &off) == 0)
1126 if (dwarf_attr (&cu_die, DW_AT_rnglists_base, &attr) != NULL)
1129 if (dwarf_formudata (&attr, &off) == 0)
1133 /* There wasn't an rnglists_base, if the Dwarf does have a
1134 .debug_rnglists section, then it might be we need the
1135 base after the first header. */
1136 Elf_Data *data = cu->dbg->sectiondata[IDX_debug_rnglists];
1137 if (offset == 0 && data != NULL)
1139 Dwarf *dbg = cu->dbg;
1140 const unsigned char *readp = data->d_buf;
1141 const unsigned char *const dataend
1142 = (unsigned char *) data->d_buf + data->d_size;
1144 uint64_t unit_length = read_4ubyte_unaligned_inc (dbg, readp);
1145 unsigned int offset_size = 4;
1146 if (unlikely (unit_length == 0xffffffff))
1148 if (unlikely (readp > dataend - 8))
1151 unit_length = read_8ubyte_unaligned_inc (dbg, readp);
1155 if (readp > dataend - 8
1157 || unit_length > (uint64_t) (dataend - readp))
1160 uint16_t version = read_2ubyte_unaligned_inc (dbg, readp);
1164 uint8_t address_size = *readp++;
1165 if (address_size != 4 && address_size != 8)
1168 uint8_t segment_size = *readp++;
1169 if (segment_size != 0)
1172 uint32_t offset_entry_count;
1173 offset_entry_count = read_4ubyte_unaligned_inc (dbg, readp);
1175 const unsigned char *offset_array_start = readp;
1176 if (offset_entry_count <= 0)
1179 uint64_t needed = offset_entry_count * offset_size;
1180 if (unit_length - 8 < needed)
1183 offset = (Dwarf_Off) (offset_array_start
1184 - (unsigned char *) data->d_buf);
1188 cu->ranges_base = offset;
1191 return cu->ranges_base;
1195 /* The start of the offset table in .debug_loclists for DWARF5. */
1196 static inline Dwarf_Off
1197 __libdw_cu_locs_base (Dwarf_CU *cu)
1199 if (cu->locs_base == (Dwarf_Off) -1)
1201 Dwarf_Off offset = 0;
1202 Dwarf_Die cu_die = CUDIE(cu);
1203 Dwarf_Attribute attr;
1204 if (dwarf_attr (&cu_die, DW_AT_loclists_base, &attr) != NULL)
1207 if (dwarf_formudata (&attr, &off) == 0)
1211 /* There wasn't an loclists_base, if the Dwarf does have a
1212 .debug_loclists section, then it might be we need the
1213 base after the first header. */
1214 Elf_Data *data = cu->dbg->sectiondata[IDX_debug_loclists];
1215 if (offset == 0 && data != NULL)
1217 Dwarf *dbg = cu->dbg;
1218 const unsigned char *readp = data->d_buf;
1219 const unsigned char *const dataend
1220 = (unsigned char *) data->d_buf + data->d_size;
1222 uint64_t unit_length = read_4ubyte_unaligned_inc (dbg, readp);
1223 unsigned int offset_size = 4;
1224 if (unlikely (unit_length == 0xffffffff))
1226 if (unlikely (readp > dataend - 8))
1229 unit_length = read_8ubyte_unaligned_inc (dbg, readp);
1233 if (readp > dataend - 8
1235 || unit_length > (uint64_t) (dataend - readp))
1238 uint16_t version = read_2ubyte_unaligned_inc (dbg, readp);
1242 uint8_t address_size = *readp++;
1243 if (address_size != 4 && address_size != 8)
1246 uint8_t segment_size = *readp++;
1247 if (segment_size != 0)
1250 uint32_t offset_entry_count;
1251 offset_entry_count = read_4ubyte_unaligned_inc (dbg, readp);
1253 const unsigned char *offset_array_start = readp;
1254 if (offset_entry_count <= 0)
1257 uint64_t needed = offset_entry_count * offset_size;
1258 if (unit_length - 8 < needed)
1261 offset = (Dwarf_Off) (offset_array_start
1262 - (unsigned char *) data->d_buf);
1266 cu->locs_base = offset;
1269 return cu->locs_base;
1272 /* Helper function for tsearch/tfind split_tree Dwarf. */
1273 int __libdw_finddbg_cb (const void *arg1, const void *arg2);
1275 /* Link skeleton and split compile units. */
1277 __libdw_link_skel_split (Dwarf_CU *skel, Dwarf_CU *split)
1279 skel->split = split;
1280 split->split = skel;
1282 /* Get .debug_addr and addr_base greedy.
1283 We also need it for the fake addr cu.
1284 There is only one per split debug. */
1285 Dwarf *dbg = skel->dbg;
1286 Dwarf *sdbg = split->dbg;
1287 if (sdbg->sectiondata[IDX_debug_addr] == NULL
1288 && dbg->sectiondata[IDX_debug_addr] != NULL)
1290 sdbg->sectiondata[IDX_debug_addr]
1291 = dbg->sectiondata[IDX_debug_addr];
1292 split->addr_base = __libdw_cu_addr_base (skel);
1293 sdbg->fake_addr_cu = dbg->fake_addr_cu;
1298 /* Given an address index for a CU return the address.
1299 Returns -1 and sets libdw_errno if an error occurs. */
1300 int __libdw_addrx (Dwarf_CU *cu, Dwarf_Word idx, Dwarf_Addr *addr);
1303 /* Helper function to set debugdir field in Dwarf, used from dwarf_begin_elf
1304 and libdwfl process_file. */
1305 char * __libdw_debugdir (int fd);
1308 /* Given the directory of a debug file, an absolute or relative dir
1309 to look in, and file returns a full path.
1311 If the file is absolute (starts with a /) a copy of file is returned.
1312 the file isn't absolute, but dir is absolute, then a path that is
1313 the concatenation of dir and file is returned. If neither file,
1314 nor dir is absolute, the path will be constructed using dir (if not
1315 NULL) and file relative to the debugdir (if valid).
1317 The debugdir and the dir may be NULL (in which case they aren't used).
1318 If file is NULL, or no full path can be constructed NULL is returned.
1320 The caller is responsible for freeing the result if not NULL. */
1321 char * __libdw_filepath (const char *debugdir, const char *dir,
1326 /* Aliases to avoid PLTs. */
1327 INTDECL (dwarf_aggregate_size)
1328 INTDECL (dwarf_attr)
1329 INTDECL (dwarf_attr_integrate)
1330 INTDECL (dwarf_begin)
1331 INTDECL (dwarf_begin_elf)
1332 INTDECL (dwarf_child)
1333 INTDECL (dwarf_default_lower_bound)
1334 INTDECL (dwarf_dieoffset)
1335 INTDECL (dwarf_diename)
1337 INTDECL (dwarf_entrypc)
1338 INTDECL (dwarf_errmsg)
1339 INTDECL (dwarf_formaddr)
1340 INTDECL (dwarf_formblock)
1341 INTDECL (dwarf_formref_die)
1342 INTDECL (dwarf_formsdata)
1343 INTDECL (dwarf_formstring)
1344 INTDECL (dwarf_formudata)
1345 INTDECL (dwarf_getabbrevattr_data)
1346 INTDECL (dwarf_getalt)
1347 INTDECL (dwarf_getarange_addr)
1348 INTDECL (dwarf_getarangeinfo)
1349 INTDECL (dwarf_getaranges)
1350 INTDECL (dwarf_getlocation_die)
1351 INTDECL (dwarf_getsrcfiles)
1352 INTDECL (dwarf_getsrclines)
1353 INTDECL (dwarf_hasattr)
1354 INTDECL (dwarf_haschildren)
1355 INTDECL (dwarf_haspc)
1356 INTDECL (dwarf_highpc)
1357 INTDECL (dwarf_lowpc)
1358 INTDECL (dwarf_nextcu)
1359 INTDECL (dwarf_next_unit)
1360 INTDECL (dwarf_offdie)
1361 INTDECL (dwarf_peel_type)
1362 INTDECL (dwarf_ranges)
1363 INTDECL (dwarf_setalt)
1364 INTDECL (dwarf_siblingof)
1365 INTDECL (dwarf_srclang)
1368 #endif /* libdwP.h */