libdwfl: Sanity check partial core file dyn data read.
[platform/upstream/elfutils.git] / libdw / libdwP.h
1 /* Internal definitions for libdw.
2    Copyright (C) 2002-2011, 2013-2018 Red Hat, Inc.
3    This file is part of elfutils.
4
5    This file is free software; you can redistribute it and/or modify
6    it under the terms of either
7
8      * the GNU Lesser General Public License as published by the Free
9        Software Foundation; either version 3 of the License, or (at
10        your option) any later version
11
12    or
13
14      * the GNU General Public License as published by the Free
15        Software Foundation; either version 2 of the License, or (at
16        your option) any later version
17
18    or both in parallel, as here.
19
20    elfutils is distributed in the hope that it will be useful, but
21    WITHOUT ANY WARRANTY; without even the implied warranty of
22    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23    General Public License for more details.
24
25    You should have received copies of the GNU General Public License and
26    the GNU Lesser General Public License along with this program.  If
27    not, see <http://www.gnu.org/licenses/>.  */
28
29 #ifndef _LIBDWP_H
30 #define _LIBDWP_H 1
31
32 #include <libintl.h>
33 #include <stdbool.h>
34
35 #include <libdw.h>
36 #include <dwarf.h>
37
38
39 /* gettext helper macros.  */
40 #define _(Str) dgettext ("elfutils", Str)
41
42
43 /* Known location expressions already decoded.  */
44 struct loc_s
45 {
46   void *addr;
47   Dwarf_Op *loc;
48   size_t nloc;
49 };
50
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.  */
54 struct loc_block_s
55 {
56   void *addr;
57   unsigned char *data;
58   size_t length;
59 };
60
61 /* Already decoded .debug_line units.  */
62 struct files_lines_s
63 {
64   Dwarf_Off debug_line_offset;
65   Dwarf_Files *files;
66   Dwarf_Lines *lines;
67 };
68
69 /* Valid indeces for the section data.  */
70 enum
71   {
72     IDX_debug_info = 0,
73     IDX_debug_types,
74     IDX_debug_abbrev,
75     IDX_debug_aranges,
76     IDX_debug_addr,
77     IDX_debug_line,
78     IDX_debug_line_str,
79     IDX_debug_frame,
80     IDX_debug_loc,
81     IDX_debug_loclists,
82     IDX_debug_pubnames,
83     IDX_debug_str,
84     IDX_debug_str_offsets,
85     IDX_debug_macinfo,
86     IDX_debug_macro,
87     IDX_debug_ranges,
88     IDX_debug_rnglists,
89     IDX_gnu_debugaltlink,
90     IDX_last
91   };
92
93
94 /* Error values.  */
95 enum
96 {
97   DWARF_E_NOERROR = 0,
98   DWARF_E_UNKNOWN_ERROR,
99   DWARF_E_INVALID_ACCESS,
100   DWARF_E_NO_REGFILE,
101   DWARF_E_IO_ERROR,
102   DWARF_E_INVALID_ELF,
103   DWARF_E_NO_DWARF,
104   DWARF_E_COMPRESSED_ERROR,
105   DWARF_E_NOELF,
106   DWARF_E_GETEHDR_ERROR,
107   DWARF_E_NOMEM,
108   DWARF_E_UNIMPL,
109   DWARF_E_INVALID_CMD,
110   DWARF_E_INVALID_VERSION,
111   DWARF_E_INVALID_FILE,
112   DWARF_E_NO_ENTRY,
113   DWARF_E_INVALID_DWARF,
114   DWARF_E_NO_STRING,
115   DWARF_E_NO_DEBUG_STR,
116   DWARF_E_NO_DEBUG_LINE_STR,
117   DWARF_E_NO_STR_OFFSETS,
118   DWARF_E_NO_ADDR,
119   DWARF_E_NO_CONSTANT,
120   DWARF_E_NO_REFERENCE,
121   DWARF_E_INVALID_REFERENCE,
122   DWARF_E_NO_DEBUG_LINE,
123   DWARF_E_INVALID_DEBUG_LINE,
124   DWARF_E_TOO_BIG,
125   DWARF_E_VERSION,
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,
131   DWARF_E_NO_BLOCK,
132   DWARF_E_INVALID_LINE_IDX,
133   DWARF_E_INVALID_ARANGE_IDX,
134   DWARF_E_NO_MATCH,
135   DWARF_E_NO_FLAG,
136   DWARF_E_INVALID_OFFSET,
137   DWARF_E_NO_DEBUG_RANGES,
138   DWARF_E_NO_DEBUG_RNGLISTS,
139   DWARF_E_INVALID_CFI,
140   DWARF_E_NO_ALT_DEBUGLINK,
141   DWARF_E_INVALID_OPCODE,
142   DWARF_E_NOT_CUDIE,
143   DWARF_E_UNKNOWN_LANGUAGE,
144   DWARF_E_NO_DEBUG_ADDR,
145 };
146
147
148 #include "dwarf_sig8_hash.h"
149
150 /* This is the structure representing the debugging state.  */
151 struct Dwarf
152 {
153   /* The underlying ELF file.  */
154   Elf *elf;
155
156   /* The (absolute) path to the ELF dir, if known.  To help locating
157      alt and dwo files.  */
158   char *debugdir;
159
160   /* dwz alternate DWARF file.  */
161   Dwarf *alt_dwarf;
162
163   /* The section data.  */
164   Elf_Data *sectiondata[IDX_last];
165
166   /* True if the file has a byte order different from the host.  */
167   bool other_byte_order;
168
169   /* If true, we allocated the ELF descriptor ourselves.  */
170   bool free_elf;
171
172   /* If >= 0, we allocated the alt_dwarf ourselves and must end it and
173      close this file descriptor.  */
174   int alt_fd;
175
176   /* Information for traversing the .debug_pubnames section.  This is
177      an array and separately allocated with malloc.  */
178   struct pubnames_s
179   {
180     Dwarf_Off cu_offset;
181     Dwarf_Off set_start;
182     unsigned int cu_header_size;
183     int address_len;
184   } *pubnames_sets;
185   size_t pubnames_nsets;
186
187   /* Search tree for the CUs.  */
188   void *cu_tree;
189   Dwarf_Off next_cu_offset;
190
191   /* Search tree and sig8 hash table for .debug_types type units.  */
192   void *tu_tree;
193   Dwarf_Off next_tu_offset;
194   Dwarf_Sig8_Hash sig8_hash;
195
196   /* Search tree for split Dwarf associated with CUs in this debug.  */
197   void *split_tree;
198
199   /* Search tree for .debug_macro operator tables.  */
200   void *macro_ops;
201
202   /* Search tree for decoded .debug_line units.  */
203   void *files_lines;
204
205   /* Address ranges.  */
206   Dwarf_Aranges *aranges;
207
208   /* Cached info from the CFI section.  */
209   struct Dwarf_CFI_s *cfi;
210
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;
217
218   /* Similar for addrx/constx, which will come from .debug_addr section.  */
219   struct Dwarf_CU *fake_addr_cu;
220
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
225   {
226     size_t size;
227     size_t remaining;
228     struct libdw_memblock *prev;
229     char mem[0];
230   } *mem_tail;
231
232   /* Default size of allocated memory blocks.  */
233   size_t mem_default_size;
234
235   /* Registered OOM handler.  */
236   Dwarf_OOM oom_handler;
237 };
238
239
240 /* Abbreviation representation.  */
241 struct Dwarf_Abbrev
242 {
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. */
248 } attribute_packed;
249
250 #include "dwarf_abbrev_hash.h"
251
252
253 /* Files in line information records.  */
254 struct Dwarf_Files_s
255   {
256     unsigned int ndirs;
257     unsigned int nfiles;
258     struct Dwarf_Fileinfo_s
259     {
260       char *name;
261       Dwarf_Word mtime;
262       Dwarf_Word length;
263     } info[0];
264     /* nfiles of those, followed by char *[ndirs].  */
265   };
266 typedef struct Dwarf_Fileinfo_s Dwarf_Fileinfo;
267
268
269 /* Representation of a row in the line table.  */
270
271 struct Dwarf_Line_s
272 {
273   Dwarf_Files *files;
274
275   Dwarf_Addr addr;
276   unsigned int file;
277   int line;
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;
288   unsigned int isa:8;
289   unsigned int discriminator:24;
290 };
291
292 struct Dwarf_Lines_s
293 {
294   size_t nlines;
295   struct Dwarf_Line_s info[0];
296 };
297
298 /* Representation of address ranges.  */
299 struct Dwarf_Aranges_s
300 {
301   Dwarf *dbg;
302   size_t naranges;
303
304   struct Dwarf_Arange_s
305   {
306     Dwarf_Addr addr;
307     Dwarf_Word length;
308     Dwarf_Off offset;
309   } info[0];
310 };
311
312
313 /* CU representation.  */
314 struct Dwarf_CU
315 {
316   Dwarf *dbg;
317   Dwarf_Off start;
318   Dwarf_Off end;
319   uint8_t address_size;
320   uint8_t offset_size;
321   uint16_t version;
322
323   size_t sec_idx; /* Normally .debug_info, could be .debug_type or "fake". */
324
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).  */
327   uint8_t unit_type;
328
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
331      unit_type.  */
332   size_t subdie_offset;
333   uint64_t unit_id8;
334
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
338      this field.  */
339   struct Dwarf_CU *split;
340
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;
347
348   /* The srcline information.  */
349   Dwarf_Lines *lines;
350
351   /* The source file information.  */
352   Dwarf_Files *files;
353
354   /* Known location lists.  */
355   void *locs;
356
357   /* Base address for use with ranges and locs.
358      Don't access directly, call __libdw_cu_base_address.  */
359   Dwarf_Addr base_address;
360
361   /* The offset into the .debug_addr section where index zero begins.
362      Don't access directly, call __libdw_cu_addr_base.  */
363   Dwarf_Off addr_base;
364
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;
368
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;
373
374   /* The start of the offset table in .debug_loclists.
375      Don't access directly, call __libdw_cu_locs_base.  */
376   Dwarf_Off locs_base;
377
378   /* Memory boundaries of this CU.  */
379   void *startp;
380   void *endp;
381 };
382
383 #define ISV4TU(cu) ((cu)->version == 4 && (cu)->sec_idx == IDX_debug_types)
384
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,
389                                  uint8_t offset_size,
390                                  uint16_t version,
391                                  uint8_t unit_type)
392 {
393 /*
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);
402 */
403
404   Dwarf_Off off = cu_start;
405   if (version < 5)
406     {
407    /*
408         LEN       VER     OFFSET    ADDR
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
414
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;
421       else
422         off += 4 * offset_size - 4 + 3 + 8;
423     }
424   else
425     {
426      /*
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.
431
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)
437         {
438           off += 8;
439           if (unit_type == DW_UT_type || unit_type == DW_UT_split_type)
440             off += offset_size;
441         }
442     }
443
444   return off;
445 }
446
447 static inline Dwarf_Off
448 __libdw_first_die_off_from_cu (struct Dwarf_CU *cu)
449 {
450   return __libdw_first_die_from_cu_start (cu->start,
451                                           cu->offset_size,
452                                           cu->version,
453                                           cu->unit_type);
454 }
455
456 #define CUDIE(fromcu)                                                         \
457   ((Dwarf_Die)                                                                \
458    {                                                                          \
459      .cu = (fromcu),                                                          \
460      .addr = ((char *) (fromcu)->dbg->sectiondata[cu_sec_idx (fromcu)]->d_buf \
461               + __libdw_first_die_off_from_cu (fromcu))                       \
462    })
463
464 #define SUBDIE(fromcu)                                                        \
465   ((Dwarf_Die)                                                                \
466    {                                                                          \
467      .cu = (fromcu),                                                          \
468      .addr = ((char *) (fromcu)->dbg->sectiondata[cu_sec_idx (fromcu)]->d_buf \
469               + (fromcu)->start + (fromcu)->subdie_offset)                    \
470    })
471
472
473 /* Prototype of a single .debug_macro operator.  */
474 typedef struct
475 {
476   Dwarf_Word nforms;
477   unsigned char const *forms;
478 } Dwarf_Macro_Op_Proto;
479
480 /* Prototype table.  */
481 typedef struct
482 {
483   /* Offset of .debug_macro section.  */
484   Dwarf_Off offset;
485
486   /* Offset of associated .debug_line section.  */
487   Dwarf_Off line_offset;
488
489   /* The source file information.  */
490   Dwarf_Files *files;
491
492   /* If this macro unit was opened through dwarf_getmacros or
493      dwarf_getmacros_die, this caches value of DW_AT_comp_dir, if
494      present.  */
495   const char *comp_dir;
496
497   /* Header length.  */
498   Dwarf_Half header_len;
499
500   uint16_t version;
501   bool is_64bit;
502   uint8_t sec_index;    /* IDX_debug_macro or IDX_debug_macinfo.  */
503
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];
508
509   /* Individual opcode prototypes.  */
510   Dwarf_Macro_Op_Proto table[];
511 } Dwarf_Macro_Op_Table;
512
513 struct Dwarf_Macro_s
514 {
515   Dwarf_Macro_Op_Table *table;
516   Dwarf_Attribute *attributes;
517   uint8_t opcode;
518 };
519
520 static inline Dwarf_Word
521 libdw_macro_nforms (Dwarf_Macro *macro)
522 {
523   return macro->table->table[macro->table->opcodes[macro->opcode - 1]].nforms;
524 }
525
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).  */
530 static inline bool
531 libdw_valid_user_form (int form)
532 {
533   switch (form)
534     {
535       case DW_FORM_block:
536       case DW_FORM_block1:
537       case DW_FORM_block2:
538       case DW_FORM_block4:
539       case DW_FORM_data1:
540       case DW_FORM_data2:
541       case DW_FORM_data4:
542       case DW_FORM_data8:
543       case DW_FORM_data16:
544       case DW_FORM_flag:
545       case DW_FORM_line_strp:
546       case DW_FORM_sdata:
547       case DW_FORM_sec_offset:
548       case DW_FORM_string:
549       case DW_FORM_strp:
550       case DW_FORM_strp_sup:
551       case DW_FORM_strx:
552       case DW_FORM_strx1:
553       case DW_FORM_strx2:
554       case DW_FORM_strx3:
555       case DW_FORM_strx4:
556       case DW_FORM_udata:
557         return true;
558       default:
559         return false;
560     }
561 }
562
563
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"
567
568
569 /* Set error value.  */
570 extern void __libdw_seterrno (int value) internal_function;
571
572
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));\
583      else                                                                     \
584        {                                                                      \
585          _required += _padding;                                               \
586          _result = (type *) ((char *) _result + _padding);                    \
587          _tail->remaining -= _required;                                       \
588        }                                                                      \
589      _result; })
590
591 #define libdw_typed_alloc(dbg, type) \
592   libdw_alloc (dbg, type, sizeof (type), 1)
593
594 /* Callback to allocate more.  */
595 extern void *__libdw_allocate (Dwarf *dbg, size_t minsize, size_t align)
596      __attribute__ ((__malloc__)) __nonnull_attribute__ (1);
597
598 /* Default OOM handler.  */
599 extern void __libdw_oom (void) __attribute ((noreturn)) attribute_hidden;
600
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.  */
603 extern int
604 internal_function
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;
612
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;
616
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;
620
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;
624
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;
628
629 /* Find the split (or skeleton) unit.  */
630 extern struct Dwarf_CU *__libdw_find_split_unit (Dwarf_CU *cu)
631      internal_function;
632
633 /* Get abbreviation with given code.  */
634 extern Dwarf_Abbrev *__libdw_findabbrev (struct Dwarf_CU *cu,
635                                          unsigned int code)
636      __nonnull_attribute__ (1) internal_function;
637
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;
643
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)
649 {
650   /* Do we need to get the abbreviation, or need to read after the code?  */
651   if (die->abbrev == NULL || readp != NULL)
652     {
653       /* Get the abbreviation code.  */
654       unsigned int 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);
660       if (readp != NULL)
661         *readp = addr;
662
663       /* Find the abbreviation.  */
664       if (die->abbrev == NULL)
665         die->abbrev = __libdw_findabbrev (die->cu, code);
666     }
667   return die->abbrev;
668 }
669
670 /* Helper functions for form handling.  */
671 extern size_t __libdw_form_val_compute_len (struct Dwarf_CU *cu,
672                                             unsigned int form,
673                                             const unsigned char *valp)
674      __nonnull_attribute__ (1, 3) internal_function;
675
676 /* Find the length of a form attribute in DIE/info data.  */
677 static inline size_t
678 __nonnull_attribute__ (1, 3)
679 __libdw_form_val_len (struct Dwarf_CU *cu, unsigned int form,
680                       const unsigned char *valp)
681 {
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[] =
685     {
686       [DW_FORM_flag_present] = 0x80,
687       [DW_FORM_implicit_const] = 0x80, /* Value is in abbrev, not in info.  */
688
689       [DW_FORM_flag] = 1,
690       [DW_FORM_data1] = 1, [DW_FORM_ref1] = 1,
691       [DW_FORM_addrx1] = 1, [DW_FORM_strx1] = 1,
692
693       [DW_FORM_data2] = 2, [DW_FORM_ref2] = 2,
694       [DW_FORM_addrx2] = 2, [DW_FORM_strx2] = 2,
695
696       [DW_FORM_addrx3] = 3, [DW_FORM_strx3] = 3,
697
698       [DW_FORM_data4] = 4, [DW_FORM_ref4] = 4, [DW_FORM_ref_sup4] = 4,
699       [DW_FORM_addrx4] = 4, [DW_FORM_strx4] = 4,
700
701       [DW_FORM_ref_sig8] = 8,
702       [DW_FORM_data8] = 8, [DW_FORM_ref8] = 8, [DW_FORM_ref_sup8] = 8,
703
704       [DW_FORM_data16] = 16,
705     };
706
707   /* Return immediately for forms with fixed lengths.  */
708   if (form < sizeof form_lengths / sizeof form_lengths[0])
709     {
710       uint8_t len = form_lengths[form];
711       if (len != 0)
712         {
713           const unsigned char *endp = cu->endp;
714           len &= 0x7f; /* Mask to allow 0x80 -> 0.  */
715           if (unlikely (len > (size_t) (endp - valp)))
716             {
717               __libdw_seterrno (DWARF_E_INVALID_DWARF);
718               return -1;
719             }
720           return len;
721         }
722     }
723
724   /* Other forms require some computation.  */
725   return __libdw_form_val_compute_len (cu, form, valp);
726 }
727
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;
731
732
733 /* Helper function to locate attribute.  */
734 extern unsigned char *__libdw_find_attr (Dwarf_Die *die,
735                                          unsigned int search_name,
736                                          unsigned int *codep,
737                                          unsigned int *formp)
738      __nonnull_attribute__ (1) internal_function;
739
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;
743
744 /* Helper function to walk scopes.  */
745 struct Dwarf_Die_Chain
746 {
747   Dwarf_Die die;
748   struct Dwarf_Die_Chain *parent;
749   bool prune;                   /* The PREVISIT function can set this.  */
750 };
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 *,
756                                                   void *arg),
757                                  int (*postvisit) (unsigned int depth,
758                                                    struct Dwarf_Die_Chain *,
759                                                    void *arg),
760                                  void *arg)
761   __nonnull_attribute__ (2, 4) internal_function;
762
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,
772                                       int sec_index)
773   __nonnull_attribute__ (5, 6, 9, 10) internal_function;
774
775 extern Dwarf_Die *__libdw_offdie (Dwarf *dbg, Dwarf_Off offset,
776                                   Dwarf_Die *result, bool debug_types)
777   internal_function;
778
779
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);
783
784
785 /* Reader hooks.  */
786
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.*/
790
791 static inline int
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)))
797 {
798   return 0;
799 }
800
801 static inline int
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)))
807 {
808   return 0;
809 }
810
811 static inline Elf_Data *
812 __libdw_checked_get_data (Dwarf *dbg, int sec_index)
813 {
814   Elf_Data *data = dbg->sectiondata[sec_index];
815   if (unlikely (data == NULL)
816       || unlikely (data->d_buf == NULL))
817     {
818       __libdw_seterrno (DWARF_E_INVALID_DWARF);
819       return NULL;
820     }
821   return data;
822 }
823
824 static inline int
825 __libdw_offset_in_section (Dwarf *dbg, int sec_index,
826                            Dwarf_Off offset, size_t size)
827 {
828   Elf_Data *data = __libdw_checked_get_data (dbg, sec_index);
829   if (data == NULL)
830     return -1;
831   if (unlikely (offset > data->d_size)
832       || unlikely (data->d_size < size)
833       || unlikely (offset > data->d_size - size))
834     {
835       __libdw_seterrno (DWARF_E_INVALID_OFFSET);
836       return -1;
837     }
838
839   return 0;
840 }
841
842 static inline bool
843 __libdw_in_section (Dwarf *dbg, int sec_index,
844                     const void *addr, size_t size)
845 {
846   Elf_Data *data = __libdw_checked_get_data (dbg, sec_index);
847   if (data == NULL)
848     return false;
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))
852     {
853       __libdw_seterrno (DWARF_E_INVALID_OFFSET);
854       return false;
855     }
856
857   return true;
858 }
859
860 #define READ_AND_RELOCATE(RELOC_HOOK, VAL)                              \
861   ({                                                                    \
862     if (!__libdw_in_section (dbg, sec_index, addr, width))              \
863       return -1;                                                        \
864                                                                         \
865     const unsigned char *orig_addr = addr;                              \
866     if (width == 4)                                                     \
867       VAL = read_4ubyte_unaligned_inc (dbg, addr);                      \
868     else                                                                \
869       VAL = read_8ubyte_unaligned_inc (dbg, addr);                      \
870                                                                         \
871     int status = RELOC_HOOK (dbg, sec_index, orig_addr, width, &VAL);   \
872     if (status < 0)                                                     \
873       return status;                                                    \
874     status > 0;                                                         \
875    })
876
877 static inline int
878 __libdw_read_address_inc (Dwarf *dbg,
879                           int sec_index, const unsigned char **addrp,
880                           int width, Dwarf_Addr *ret)
881 {
882   const unsigned char *addr = *addrp;
883   READ_AND_RELOCATE (__libdw_relocate_address, (*ret));
884   *addrp = addr;
885   return 0;
886 }
887
888 static inline int
889 __libdw_read_address (Dwarf *dbg,
890                       int sec_index, const unsigned char *addr,
891                       int width, Dwarf_Addr *ret)
892 {
893   READ_AND_RELOCATE (__libdw_relocate_address, (*ret));
894   return 0;
895 }
896
897 static inline int
898 __libdw_read_offset_inc (Dwarf *dbg,
899                          int sec_index, const unsigned char **addrp,
900                          int width, Dwarf_Off *ret, int sec_ret,
901                          size_t size)
902 {
903   const unsigned char *addr = *addrp;
904   READ_AND_RELOCATE (__libdw_relocate_offset, (*ret));
905   *addrp = addr;
906   return __libdw_offset_in_section (dbg, sec_ret, *ret, size);
907 }
908
909 static inline int
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,
913                      size_t size)
914 {
915   READ_AND_RELOCATE (__libdw_relocate_offset, (*ret));
916   return __libdw_offset_in_section (dbg_ret, sec_ret, *ret, size);
917 }
918
919 static inline size_t
920 cu_sec_idx (struct Dwarf_CU *cu)
921 {
922   return cu->sec_idx;
923 }
924
925 static inline bool
926 is_cudie (Dwarf_Die *cudie)
927 {
928   return cudie->cu != NULL && CUDIE (cudie->cu).addr == cudie->addr;
929 }
930
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,
939                                      int width,
940                                      Dwarf_Addr *beginp, Dwarf_Addr *endp,
941                                      Dwarf_Addr *basep)
942   internal_function;
943
944 const unsigned char * __libdw_formptr (Dwarf_Attribute *attr, int sec_index,
945                                        int err_nodata,
946                                        const unsigned char **endpp,
947                                        Dwarf_Off *offsetp)
948   internal_function;
949
950 /* Fills in the given attribute to point at an empty location expression.  */
951 void __libdw_empty_loc_attr (Dwarf_Attribute *attr)
952   internal_function;
953
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)
962   internal_function
963   __nonnull_attribute__ (1);
964
965 /* Load and return value of DW_AT_comp_dir from CUDIE.  */
966 const char *__libdw_getcompdir (Dwarf_Die *cudie);
967
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);
971
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)
975 {
976   if (cu->addr_base == (Dwarf_Off) -1)
977     {
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)
983         {
984           Dwarf_Word off;
985           if (dwarf_formudata (&attr, &off) == 0)
986             offset = off;
987         }
988       cu->addr_base = offset;
989     }
990
991   return cu->addr_base;
992 }
993
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)
998 {
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.  */
1006
1007   if (cu == NULL && dbg != NULL)
1008     {
1009       Dwarf_CU *first_cu;
1010       if (dwarf_get_units (dbg, NULL, &first_cu,
1011                            NULL, NULL, NULL, NULL) == 0)
1012         cu = first_cu;
1013     }
1014
1015   if (cu != NULL)
1016     {
1017       if (cu->str_off_base == (Dwarf_Off) -1)
1018         {
1019           Dwarf_Die cu_die = CUDIE(cu);
1020           Dwarf_Attribute attr;
1021           if (dwarf_attr (&cu_die, DW_AT_str_offsets_base, &attr) != NULL)
1022             {
1023               Dwarf_Word off;
1024               if (dwarf_formudata (&attr, &off) == 0)
1025                 {
1026                   cu->str_off_base = off;
1027                   return cu->str_off_base;
1028                 }
1029             }
1030           /* For older DWARF simply assume zero (no header).  */
1031           if (cu->version < 5)
1032             {
1033               cu->str_off_base = 0;
1034               return cu->str_off_base;
1035             }
1036
1037           if (dbg == NULL)
1038             dbg = cu->dbg;
1039         }
1040       else
1041         return cu->str_off_base;
1042     }
1043
1044   /* No str_offsets_base attribute, we have to assume "zero".
1045      But there could be a header first.  */
1046   Dwarf_Off off = 0;
1047   if (dbg == NULL)
1048     goto no_header;
1049
1050   Elf_Data *data =  dbg->sectiondata[IDX_debug_str_offsets];
1051   if (data == NULL)
1052     goto no_header;
1053
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;
1059
1060   uint64_t unit_length;
1061   uint16_t version;
1062
1063   unit_length = read_4ubyte_unaligned_inc (dbg, readp);
1064   if (unlikely (unit_length == 0xffffffff))
1065     {
1066       if (unlikely (readendp - readp < 8))
1067         goto no_header;
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. */
1072     }
1073
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
1078       || unit_length < 4
1079       || (uint64_t) (readendp - readp) < unit_length)
1080     goto no_header;
1081
1082   version = read_2ubyte_unaligned_inc (dbg, readp);
1083   if (version != 5)
1084     goto no_header;
1085   /* padding */
1086   read_2ubyte_unaligned_inc (dbg, readp);
1087
1088   off = (Dwarf_Off) (readp - start);
1089
1090  no_header:
1091   if (cu != NULL)
1092     cu->str_off_base = off;
1093
1094   return off;
1095 }
1096
1097
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)
1100 {
1101   return str_offsets_base_off (NULL, cu);
1102 }
1103
1104
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)
1109 {
1110   if (cu->ranges_base == (Dwarf_Off) -1)
1111     {
1112       Dwarf_Off offset = 0;
1113       Dwarf_Die cu_die = CUDIE(cu);
1114       Dwarf_Attribute attr;
1115       if (cu->version < 5)
1116         {
1117           if (dwarf_attr (&cu_die, DW_AT_GNU_ranges_base, &attr) != NULL)
1118             {
1119               Dwarf_Word off;
1120               if (dwarf_formudata (&attr, &off) == 0)
1121                 offset = off;
1122             }
1123         }
1124       else
1125         {
1126           if (dwarf_attr (&cu_die, DW_AT_rnglists_base, &attr) != NULL)
1127             {
1128               Dwarf_Word off;
1129               if (dwarf_formudata (&attr, &off) == 0)
1130                 offset = off;
1131             }
1132
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)
1138             {
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;
1143
1144               uint64_t unit_length = read_4ubyte_unaligned_inc (dbg, readp);
1145               unsigned int offset_size = 4;
1146               if (unlikely (unit_length == 0xffffffff))
1147                 {
1148                   if (unlikely (readp > dataend - 8))
1149                     goto no_header;
1150
1151                   unit_length = read_8ubyte_unaligned_inc (dbg, readp);
1152                   offset_size = 8;
1153                 }
1154
1155               if (readp > dataend - 8
1156                   || unit_length < 8
1157                   || unit_length > (uint64_t) (dataend - readp))
1158                 goto no_header;
1159
1160               uint16_t version = read_2ubyte_unaligned_inc (dbg, readp);
1161               if (version != 5)
1162                 goto no_header;
1163
1164               uint8_t address_size = *readp++;
1165               if (address_size != 4 && address_size != 8)
1166                 goto no_header;
1167
1168               uint8_t segment_size = *readp++;
1169               if (segment_size != 0)
1170                 goto no_header;
1171
1172               uint32_t offset_entry_count;
1173               offset_entry_count = read_4ubyte_unaligned_inc (dbg, readp);
1174
1175               const unsigned char *offset_array_start = readp;
1176               if (offset_entry_count <= 0)
1177                 goto no_header;
1178
1179               uint64_t needed = offset_entry_count * offset_size;
1180               if (unit_length - 8 < needed)
1181                 goto no_header;
1182
1183               offset = (Dwarf_Off) (offset_array_start
1184                                     - (unsigned char *) data->d_buf);
1185             }
1186         }
1187     no_header:
1188       cu->ranges_base = offset;
1189     }
1190
1191   return cu->ranges_base;
1192 }
1193
1194
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)
1198 {
1199   if (cu->locs_base == (Dwarf_Off) -1)
1200     {
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)
1205         {
1206           Dwarf_Word off;
1207           if (dwarf_formudata (&attr, &off) == 0)
1208             offset = off;
1209         }
1210
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)
1216         {
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;
1221
1222           uint64_t unit_length = read_4ubyte_unaligned_inc (dbg, readp);
1223           unsigned int offset_size = 4;
1224           if (unlikely (unit_length == 0xffffffff))
1225             {
1226               if (unlikely (readp > dataend - 8))
1227                 goto no_header;
1228
1229               unit_length = read_8ubyte_unaligned_inc (dbg, readp);
1230               offset_size = 8;
1231             }
1232
1233           if (readp > dataend - 8
1234               || unit_length < 8
1235               || unit_length > (uint64_t) (dataend - readp))
1236             goto no_header;
1237
1238           uint16_t version = read_2ubyte_unaligned_inc (dbg, readp);
1239           if (version != 5)
1240             goto no_header;
1241
1242           uint8_t address_size = *readp++;
1243           if (address_size != 4 && address_size != 8)
1244             goto no_header;
1245
1246           uint8_t segment_size = *readp++;
1247           if (segment_size != 0)
1248             goto no_header;
1249
1250           uint32_t offset_entry_count;
1251           offset_entry_count = read_4ubyte_unaligned_inc (dbg, readp);
1252
1253           const unsigned char *offset_array_start = readp;
1254           if (offset_entry_count <= 0)
1255             goto no_header;
1256
1257           uint64_t needed = offset_entry_count * offset_size;
1258           if (unit_length - 8 < needed)
1259             goto no_header;
1260
1261           offset = (Dwarf_Off) (offset_array_start
1262                                 - (unsigned char *) data->d_buf);
1263         }
1264
1265     no_header:
1266       cu->locs_base = offset;
1267     }
1268
1269   return cu->locs_base;
1270 }
1271
1272 /* Helper function for tsearch/tfind split_tree Dwarf.  */
1273 int __libdw_finddbg_cb (const void *arg1, const void *arg2);
1274
1275 /* Link skeleton and split compile units.  */
1276 static inline void
1277 __libdw_link_skel_split (Dwarf_CU *skel, Dwarf_CU *split)
1278 {
1279   skel->split = split;
1280   split->split = skel;
1281
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)
1289     {
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;
1294     }
1295 }
1296
1297
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);
1301
1302
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);
1306
1307
1308 /* Given the directory of a debug file, an absolute or relative dir
1309    to look in, and file returns a full path.
1310
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).
1316
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.
1319
1320    The caller is responsible for freeing the result if not NULL.  */
1321 char * __libdw_filepath (const char *debugdir, const char *dir,
1322                          const char *file)
1323   internal_function;
1324
1325
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)
1336 INTDECL (dwarf_end)
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)
1366 INTDECL (dwarf_tag)
1367
1368 #endif  /* libdwP.h */