ctf-open.c revision 1.1.1.2.2.1 1 /* Opening CTF files.
2 Copyright (C) 2019-2024 Free Software Foundation, Inc.
3
4 This file is part of libctf.
5
6 libctf is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 This program is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 See the GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; see the file COPYING. If not see
18 <http://www.gnu.org/licenses/>. */
19
20 #include <ctf-impl.h>
21 #include <stddef.h>
22 #include <string.h>
23 #include <sys/types.h>
24 #include <elf.h>
25 #include "swap.h"
26 #include <bfd.h>
27 #include <zlib.h>
28
29 static const ctf_dmodel_t _libctf_models[] = {
30 {"ILP32", CTF_MODEL_ILP32, 4, 1, 2, 4, 4},
31 {"LP64", CTF_MODEL_LP64, 8, 1, 2, 4, 8},
32 {NULL, 0, 0, 0, 0, 0, 0}
33 };
34
35 const char _CTF_SECTION[] = ".ctf";
36 const char _CTF_NULLSTR[] = "";
37
38 /* Version-sensitive accessors. */
39
40 static uint32_t
41 get_kind_v1 (uint32_t info)
42 {
43 return (CTF_V1_INFO_KIND (info));
44 }
45
46 static uint32_t
47 get_root_v1 (uint32_t info)
48 {
49 return (CTF_V1_INFO_ISROOT (info));
50 }
51
52 static uint32_t
53 get_vlen_v1 (uint32_t info)
54 {
55 return (CTF_V1_INFO_VLEN (info));
56 }
57
58 static uint32_t
59 get_kind_v2 (uint32_t info)
60 {
61 return (CTF_V2_INFO_KIND (info));
62 }
63
64 static uint32_t
65 get_root_v2 (uint32_t info)
66 {
67 return (CTF_V2_INFO_ISROOT (info));
68 }
69
70 static uint32_t
71 get_vlen_v2 (uint32_t info)
72 {
73 return (CTF_V2_INFO_VLEN (info));
74 }
75
76 static inline ssize_t
77 get_ctt_size_common (const ctf_dict_t *fp _libctf_unused_,
78 const ctf_type_t *tp _libctf_unused_,
79 ssize_t *sizep, ssize_t *incrementp, size_t lsize,
80 size_t csize, size_t ctf_type_size,
81 size_t ctf_stype_size, size_t ctf_lsize_sent)
82 {
83 ssize_t size, increment;
84
85 if (csize == ctf_lsize_sent)
86 {
87 size = lsize;
88 increment = ctf_type_size;
89 }
90 else
91 {
92 size = csize;
93 increment = ctf_stype_size;
94 }
95
96 if (sizep)
97 *sizep = size;
98 if (incrementp)
99 *incrementp = increment;
100
101 return size;
102 }
103
104 static ssize_t
105 get_ctt_size_v1 (const ctf_dict_t *fp, const ctf_type_t *tp,
106 ssize_t *sizep, ssize_t *incrementp)
107 {
108 ctf_type_v1_t *t1p = (ctf_type_v1_t *) tp;
109
110 return (get_ctt_size_common (fp, tp, sizep, incrementp,
111 CTF_TYPE_LSIZE (t1p), t1p->ctt_size,
112 sizeof (ctf_type_v1_t), sizeof (ctf_stype_v1_t),
113 CTF_LSIZE_SENT_V1));
114 }
115
116 /* Return the size that a v1 will be once it is converted to v2. */
117
118 static ssize_t
119 get_ctt_size_v2_unconverted (const ctf_dict_t *fp, const ctf_type_t *tp,
120 ssize_t *sizep, ssize_t *incrementp)
121 {
122 ctf_type_v1_t *t1p = (ctf_type_v1_t *) tp;
123
124 return (get_ctt_size_common (fp, tp, sizep, incrementp,
125 CTF_TYPE_LSIZE (t1p), t1p->ctt_size,
126 sizeof (ctf_type_t), sizeof (ctf_stype_t),
127 CTF_LSIZE_SENT));
128 }
129
130 static ssize_t
131 get_ctt_size_v2 (const ctf_dict_t *fp, const ctf_type_t *tp,
132 ssize_t *sizep, ssize_t *incrementp)
133 {
134 return (get_ctt_size_common (fp, tp, sizep, incrementp,
135 CTF_TYPE_LSIZE (tp), tp->ctt_size,
136 sizeof (ctf_type_t), sizeof (ctf_stype_t),
137 CTF_LSIZE_SENT));
138 }
139
140 static ssize_t
141 get_vbytes_common (ctf_dict_t *fp, unsigned short kind,
142 ssize_t size _libctf_unused_, size_t vlen)
143 {
144 switch (kind)
145 {
146 case CTF_K_INTEGER:
147 case CTF_K_FLOAT:
148 return (sizeof (uint32_t));
149 case CTF_K_SLICE:
150 return (sizeof (ctf_slice_t));
151 case CTF_K_ENUM:
152 return (sizeof (ctf_enum_t) * vlen);
153 case CTF_K_FORWARD:
154 case CTF_K_UNKNOWN:
155 case CTF_K_POINTER:
156 case CTF_K_TYPEDEF:
157 case CTF_K_VOLATILE:
158 case CTF_K_CONST:
159 case CTF_K_RESTRICT:
160 return 0;
161 default:
162 ctf_set_errno (fp, ECTF_CORRUPT);
163 ctf_err_warn (fp, 0, 0, _("detected invalid CTF kind: %x"), kind);
164 return -1;
165 }
166 }
167
168 static ssize_t
169 get_vbytes_v1 (ctf_dict_t *fp, unsigned short kind, ssize_t size, size_t vlen)
170 {
171 switch (kind)
172 {
173 case CTF_K_ARRAY:
174 return (sizeof (ctf_array_v1_t));
175 case CTF_K_FUNCTION:
176 return (sizeof (unsigned short) * (vlen + (vlen & 1)));
177 case CTF_K_STRUCT:
178 case CTF_K_UNION:
179 if (size < CTF_LSTRUCT_THRESH_V1)
180 return (sizeof (ctf_member_v1_t) * vlen);
181 else
182 return (sizeof (ctf_lmember_v1_t) * vlen);
183 }
184
185 return (get_vbytes_common (fp, kind, size, vlen));
186 }
187
188 static ssize_t
189 get_vbytes_v2 (ctf_dict_t *fp, unsigned short kind, ssize_t size, size_t vlen)
190 {
191 switch (kind)
192 {
193 case CTF_K_ARRAY:
194 return (sizeof (ctf_array_t));
195 case CTF_K_FUNCTION:
196 return (sizeof (uint32_t) * (vlen + (vlen & 1)));
197 case CTF_K_STRUCT:
198 case CTF_K_UNION:
199 if (size < CTF_LSTRUCT_THRESH)
200 return (sizeof (ctf_member_t) * vlen);
201 else
202 return (sizeof (ctf_lmember_t) * vlen);
203 }
204
205 return (get_vbytes_common (fp, kind, size, vlen));
206 }
207
208 static const ctf_dictops_t ctf_dictops[] = {
209 {NULL, NULL, NULL, NULL, NULL},
210 /* CTF_VERSION_1 */
211 {get_kind_v1, get_root_v1, get_vlen_v1, get_ctt_size_v1, get_vbytes_v1},
212 /* CTF_VERSION_1_UPGRADED_3 */
213 {get_kind_v2, get_root_v2, get_vlen_v2, get_ctt_size_v2, get_vbytes_v2},
214 /* CTF_VERSION_2 */
215 {get_kind_v2, get_root_v2, get_vlen_v2, get_ctt_size_v2, get_vbytes_v2},
216 /* CTF_VERSION_3, identical to 2: only new type kinds */
217 {get_kind_v2, get_root_v2, get_vlen_v2, get_ctt_size_v2, get_vbytes_v2},
218 };
219
220 /* Initialize the symtab translation table as appropriate for its indexing
221 state. For unindexed symtypetabs, fill each entry with the offset of the CTF
222 type or function data corresponding to each STT_FUNC or STT_OBJECT entry in
223 the symbol table. For indexed symtypetabs, do nothing: the needed
224 initialization for indexed lookups may be quite expensive, so it is done only
225 as needed, when lookups happen. (In particular, the majority of indexed
226 symtypetabs come from the compiler, and all the linker does is iteration over
227 all entries, which doesn't need this initialization.)
228
229 The SP symbol table section may be NULL if there is no symtab.
230
231 If init_symtab works on one call, it cannot fail on future calls to the same
232 fp: ctf_symsect_endianness relies on this. */
233
234 static int
235 init_symtab (ctf_dict_t *fp, const ctf_header_t *hp, const ctf_sect_t *sp)
236 {
237 const unsigned char *symp;
238 int skip_func_info = 0;
239 int i;
240 uint32_t *xp = fp->ctf_sxlate;
241 uint32_t *xend = PTR_ADD (xp, fp->ctf_nsyms);
242
243 uint32_t objtoff = hp->cth_objtoff;
244 uint32_t funcoff = hp->cth_funcoff;
245
246 /* If the CTF_F_NEWFUNCINFO flag is not set, pretend the func info section
247 is empty: this compiler is too old to emit a function info section we
248 understand. */
249
250 if (!(hp->cth_flags & CTF_F_NEWFUNCINFO))
251 skip_func_info = 1;
252
253 if (hp->cth_objtidxoff < hp->cth_funcidxoff)
254 fp->ctf_objtidx_names = (uint32_t *) (fp->ctf_buf + hp->cth_objtidxoff);
255 if (hp->cth_funcidxoff < hp->cth_varoff && !skip_func_info)
256 fp->ctf_funcidx_names = (uint32_t *) (fp->ctf_buf + hp->cth_funcidxoff);
257
258 /* Don't bother doing the rest if everything is indexed, or if we don't have a
259 symbol table: we will never use it. */
260 if ((fp->ctf_objtidx_names && fp->ctf_funcidx_names) || !sp || !sp->cts_data)
261 return 0;
262
263 /* The CTF data object and function type sections are ordered to match the
264 relative order of the respective symbol types in the symtab, unless there
265 is an index section, in which case the order is arbitrary and the index
266 gives the mapping. If no type information is available for a symbol table
267 entry, a pad is inserted in the CTF section. As a further optimization,
268 anonymous or undefined symbols are omitted from the CTF data. If an
269 index is available for function symbols but not object symbols, or vice
270 versa, we populate the xslate table for the unindexed symbols only. */
271
272 for (i = 0, symp = sp->cts_data; xp < xend; xp++, symp += sp->cts_entsize,
273 i++)
274 {
275 ctf_link_sym_t sym;
276
277 switch (sp->cts_entsize)
278 {
279 case sizeof (Elf64_Sym):
280 {
281 const Elf64_Sym *symp64 = (Elf64_Sym *) (uintptr_t) symp;
282 ctf_elf64_to_link_sym (fp, &sym, symp64, i);
283 }
284 break;
285 case sizeof (Elf32_Sym):
286 {
287 const Elf32_Sym *symp32 = (Elf32_Sym *) (uintptr_t) symp;
288 ctf_elf32_to_link_sym (fp, &sym, symp32, i);
289 }
290 break;
291 default:
292 return ECTF_SYMTAB;
293 }
294
295 /* This call may be led astray if our idea of the symtab's endianness is
296 wrong, but when this is fixed by a call to ctf_symsect_endianness,
297 init_symtab will be called again with the right endianness in
298 force. */
299 if (ctf_symtab_skippable (&sym))
300 {
301 *xp = -1u;
302 continue;
303 }
304
305 switch (sym.st_type)
306 {
307 case STT_OBJECT:
308 if (fp->ctf_objtidx_names || objtoff >= hp->cth_funcoff)
309 {
310 *xp = -1u;
311 break;
312 }
313
314 *xp = objtoff;
315 objtoff += sizeof (uint32_t);
316 break;
317
318 case STT_FUNC:
319 if (fp->ctf_funcidx_names || funcoff >= hp->cth_objtidxoff
320 || skip_func_info)
321 {
322 *xp = -1u;
323 break;
324 }
325
326 *xp = funcoff;
327 funcoff += sizeof (uint32_t);
328 break;
329
330 default:
331 *xp = -1u;
332 break;
333 }
334 }
335
336 ctf_dprintf ("loaded %lu symtab entries\n", fp->ctf_nsyms);
337 return 0;
338 }
339
340 /* Reset the CTF base pointer and derive the buf pointer from it, initializing
341 everything in the ctf_dict that depends on the base or buf pointers.
342
343 The original gap between the buf and base pointers, if any -- the original,
344 unconverted CTF header -- is kept, but its contents are not specified and are
345 never used. */
346
347 static void
348 ctf_set_base (ctf_dict_t *fp, const ctf_header_t *hp, unsigned char *base)
349 {
350 fp->ctf_buf = base + (fp->ctf_buf - fp->ctf_base);
351 fp->ctf_base = base;
352 fp->ctf_vars = (ctf_varent_t *) ((const char *) fp->ctf_buf +
353 hp->cth_varoff);
354 fp->ctf_nvars = (hp->cth_typeoff - hp->cth_varoff) / sizeof (ctf_varent_t);
355
356 fp->ctf_str[CTF_STRTAB_0].cts_strs = (const char *) fp->ctf_buf
357 + hp->cth_stroff;
358 fp->ctf_str[CTF_STRTAB_0].cts_len = hp->cth_strlen;
359
360 /* If we have a parent dict name and label, store the relocated string
361 pointers in the CTF dict for easy access later. */
362
363 /* Note: before conversion, these will be set to values that will be
364 immediately invalidated by the conversion process, but the conversion
365 process will call ctf_set_base() again to fix things up. */
366
367 if (hp->cth_parlabel != 0)
368 fp->ctf_parlabel = ctf_strptr (fp, hp->cth_parlabel);
369 if (hp->cth_parname != 0)
370 fp->ctf_parname = ctf_strptr (fp, hp->cth_parname);
371 if (hp->cth_cuname != 0)
372 fp->ctf_cuname = ctf_strptr (fp, hp->cth_cuname);
373
374 if (fp->ctf_cuname)
375 ctf_dprintf ("ctf_set_base: CU name %s\n", fp->ctf_cuname);
376 if (fp->ctf_parname)
377 ctf_dprintf ("ctf_set_base: parent name %s (label %s)\n",
378 fp->ctf_parname,
379 fp->ctf_parlabel ? fp->ctf_parlabel : "<NULL>");
380 }
381
382 /* Set the version of the CTF file. */
383
384 /* When this is reset, LCTF_* changes behaviour, but there is no guarantee that
385 the variable data list associated with each type has been upgraded: the
386 caller must ensure this has been done in advance. */
387
388 static void
389 ctf_set_version (ctf_dict_t *fp, ctf_header_t *cth, int ctf_version)
390 {
391 fp->ctf_version = ctf_version;
392 cth->cth_version = ctf_version;
393 fp->ctf_dictops = &ctf_dictops[ctf_version];
394 }
395
396
397 /* Upgrade the header to CTF_VERSION_3. The upgrade is done in-place. */
398 static void
399 upgrade_header (ctf_header_t *hp)
400 {
401 ctf_header_v2_t *oldhp = (ctf_header_v2_t *) hp;
402
403 hp->cth_strlen = oldhp->cth_strlen;
404 hp->cth_stroff = oldhp->cth_stroff;
405 hp->cth_typeoff = oldhp->cth_typeoff;
406 hp->cth_varoff = oldhp->cth_varoff;
407 hp->cth_funcidxoff = hp->cth_varoff; /* No index sections. */
408 hp->cth_objtidxoff = hp->cth_funcidxoff;
409 hp->cth_funcoff = oldhp->cth_funcoff;
410 hp->cth_objtoff = oldhp->cth_objtoff;
411 hp->cth_lbloff = oldhp->cth_lbloff;
412 hp->cth_cuname = 0; /* No CU name. */
413 }
414
415 /* Upgrade the type table to CTF_VERSION_3 (really CTF_VERSION_1_UPGRADED_3)
416 from CTF_VERSION_1.
417
418 The upgrade is not done in-place: the ctf_base is moved. ctf_strptr() must
419 not be called before reallocation is complete.
420
421 Sections not checked here due to nonexistence or nonpopulated state in older
422 formats: objtidx, funcidx.
423
424 Type kinds not checked here due to nonexistence in older formats:
425 CTF_K_SLICE. */
426 static int
427 upgrade_types_v1 (ctf_dict_t *fp, ctf_header_t *cth)
428 {
429 const ctf_type_v1_t *tbuf;
430 const ctf_type_v1_t *tend;
431 unsigned char *ctf_base, *old_ctf_base = (unsigned char *) fp->ctf_dynbase;
432 ctf_type_t *t2buf;
433
434 ssize_t increase = 0, size, increment, v2increment, vbytes, v2bytes;
435 const ctf_type_v1_t *tp;
436 ctf_type_t *t2p;
437
438 tbuf = (ctf_type_v1_t *) (fp->ctf_buf + cth->cth_typeoff);
439 tend = (ctf_type_v1_t *) (fp->ctf_buf + cth->cth_stroff);
440
441 /* Much like init_static_types(), this is a two-pass process.
442
443 First, figure out the new type-section size needed. (It is possible,
444 in theory, for it to be less than the old size, but this is very
445 unlikely. It cannot be so small that cth_typeoff ends up of negative
446 size. We validate this with an assertion below.)
447
448 We must cater not only for changes in vlen and types sizes but also
449 for changes in 'increment', which happen because v2 places some types
450 into ctf_stype_t where v1 would be forced to use the larger non-stype. */
451
452 for (tp = tbuf; tp < tend;
453 tp = (ctf_type_v1_t *) ((uintptr_t) tp + increment + vbytes))
454 {
455 unsigned short kind = CTF_V1_INFO_KIND (tp->ctt_info);
456 unsigned long vlen = CTF_V1_INFO_VLEN (tp->ctt_info);
457
458 size = get_ctt_size_v1 (fp, (const ctf_type_t *) tp, NULL, &increment);
459 vbytes = get_vbytes_v1 (fp, kind, size, vlen);
460
461 get_ctt_size_v2_unconverted (fp, (const ctf_type_t *) tp, NULL,
462 &v2increment);
463 v2bytes = get_vbytes_v2 (fp, kind, size, vlen);
464
465 if ((vbytes < 0) || (size < 0))
466 return ECTF_CORRUPT;
467
468 increase += v2increment - increment; /* May be negative. */
469 increase += v2bytes - vbytes;
470 }
471
472 /* Allocate enough room for the new buffer, then copy everything but the type
473 section into place, and reset the base accordingly. Leave the version
474 number unchanged, so that LCTF_INFO_* still works on the
475 as-yet-untranslated type info. */
476
477 if ((ctf_base = malloc (fp->ctf_size + increase)) == NULL)
478 return ECTF_ZALLOC;
479
480 /* Start at ctf_buf, not ctf_base, to squeeze out the original header: we
481 never use it and it is unconverted. */
482
483 memcpy (ctf_base, fp->ctf_buf, cth->cth_typeoff);
484 memcpy (ctf_base + cth->cth_stroff + increase,
485 fp->ctf_buf + cth->cth_stroff, cth->cth_strlen);
486
487 memset (ctf_base + cth->cth_typeoff, 0, cth->cth_stroff - cth->cth_typeoff
488 + increase);
489
490 cth->cth_stroff += increase;
491 fp->ctf_size += increase;
492 assert (cth->cth_stroff >= cth->cth_typeoff);
493 fp->ctf_base = ctf_base;
494 fp->ctf_buf = ctf_base;
495 fp->ctf_dynbase = ctf_base;
496 ctf_set_base (fp, cth, ctf_base);
497
498 t2buf = (ctf_type_t *) (fp->ctf_buf + cth->cth_typeoff);
499
500 /* Iterate through all the types again, upgrading them.
501
502 Everything that hasn't changed can just be outright memcpy()ed.
503 Things that have changed need field-by-field consideration. */
504
505 for (tp = tbuf, t2p = t2buf; tp < tend;
506 tp = (ctf_type_v1_t *) ((uintptr_t) tp + increment + vbytes),
507 t2p = (ctf_type_t *) ((uintptr_t) t2p + v2increment + v2bytes))
508 {
509 unsigned short kind = CTF_V1_INFO_KIND (tp->ctt_info);
510 int isroot = CTF_V1_INFO_ISROOT (tp->ctt_info);
511 unsigned long vlen = CTF_V1_INFO_VLEN (tp->ctt_info);
512 ssize_t v2size;
513 void *vdata, *v2data;
514
515 size = get_ctt_size_v1 (fp, (const ctf_type_t *) tp, NULL, &increment);
516 vbytes = get_vbytes_v1 (fp, kind, size, vlen);
517
518 t2p->ctt_name = tp->ctt_name;
519 t2p->ctt_info = CTF_TYPE_INFO (kind, isroot, vlen);
520
521 switch (kind)
522 {
523 case CTF_K_FUNCTION:
524 case CTF_K_FORWARD:
525 case CTF_K_TYPEDEF:
526 case CTF_K_POINTER:
527 case CTF_K_VOLATILE:
528 case CTF_K_CONST:
529 case CTF_K_RESTRICT:
530 t2p->ctt_type = tp->ctt_type;
531 break;
532 case CTF_K_INTEGER:
533 case CTF_K_FLOAT:
534 case CTF_K_ARRAY:
535 case CTF_K_STRUCT:
536 case CTF_K_UNION:
537 case CTF_K_ENUM:
538 case CTF_K_UNKNOWN:
539 if ((size_t) size <= CTF_MAX_SIZE)
540 t2p->ctt_size = size;
541 else
542 {
543 t2p->ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
544 t2p->ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
545 }
546 break;
547 }
548
549 v2size = get_ctt_size_v2 (fp, t2p, NULL, &v2increment);
550 v2bytes = get_vbytes_v2 (fp, kind, v2size, vlen);
551
552 /* Catch out-of-sync get_ctt_size_*(). The count goes wrong if
553 these are not identical (and having them different makes no
554 sense semantically). */
555
556 assert (size == v2size);
557
558 /* Now the varlen info. */
559
560 vdata = (void *) ((uintptr_t) tp + increment);
561 v2data = (void *) ((uintptr_t) t2p + v2increment);
562
563 switch (kind)
564 {
565 case CTF_K_ARRAY:
566 {
567 const ctf_array_v1_t *ap = (const ctf_array_v1_t *) vdata;
568 ctf_array_t *a2p = (ctf_array_t *) v2data;
569
570 a2p->cta_contents = ap->cta_contents;
571 a2p->cta_index = ap->cta_index;
572 a2p->cta_nelems = ap->cta_nelems;
573 break;
574 }
575 case CTF_K_STRUCT:
576 case CTF_K_UNION:
577 {
578 ctf_member_t tmp;
579 const ctf_member_v1_t *m1 = (const ctf_member_v1_t *) vdata;
580 const ctf_lmember_v1_t *lm1 = (const ctf_lmember_v1_t *) m1;
581 ctf_member_t *m2 = (ctf_member_t *) v2data;
582 ctf_lmember_t *lm2 = (ctf_lmember_t *) m2;
583 unsigned long i;
584
585 /* We walk all four pointers forward, but only reference the two
586 that are valid for the given size, to avoid quadruplicating all
587 the code. */
588
589 for (i = vlen; i != 0; i--, m1++, lm1++, m2++, lm2++)
590 {
591 size_t offset;
592 if (size < CTF_LSTRUCT_THRESH_V1)
593 {
594 offset = m1->ctm_offset;
595 tmp.ctm_name = m1->ctm_name;
596 tmp.ctm_type = m1->ctm_type;
597 }
598 else
599 {
600 offset = CTF_LMEM_OFFSET (lm1);
601 tmp.ctm_name = lm1->ctlm_name;
602 tmp.ctm_type = lm1->ctlm_type;
603 }
604 if (size < CTF_LSTRUCT_THRESH)
605 {
606 m2->ctm_name = tmp.ctm_name;
607 m2->ctm_type = tmp.ctm_type;
608 m2->ctm_offset = offset;
609 }
610 else
611 {
612 lm2->ctlm_name = tmp.ctm_name;
613 lm2->ctlm_type = tmp.ctm_type;
614 lm2->ctlm_offsethi = CTF_OFFSET_TO_LMEMHI (offset);
615 lm2->ctlm_offsetlo = CTF_OFFSET_TO_LMEMLO (offset);
616 }
617 }
618 break;
619 }
620 case CTF_K_FUNCTION:
621 {
622 unsigned long i;
623 unsigned short *a1 = (unsigned short *) vdata;
624 uint32_t *a2 = (uint32_t *) v2data;
625
626 for (i = vlen; i != 0; i--, a1++, a2++)
627 *a2 = *a1;
628 }
629 /* FALLTHRU */
630 default:
631 /* Catch out-of-sync get_vbytes_*(). */
632 assert (vbytes == v2bytes);
633 memcpy (v2data, vdata, vbytes);
634 }
635 }
636
637 /* Verify that the entire region was converted. If not, we are either
638 converting too much, or too little (leading to a buffer overrun either here
639 or at read time, in init_static_types().) */
640
641 assert ((size_t) t2p - (size_t) fp->ctf_buf == cth->cth_stroff);
642
643 ctf_set_version (fp, cth, CTF_VERSION_1_UPGRADED_3);
644 free (old_ctf_base);
645
646 return 0;
647 }
648
649 /* Upgrade from any earlier version. */
650 static int
651 upgrade_types (ctf_dict_t *fp, ctf_header_t *cth)
652 {
653 switch (cth->cth_version)
654 {
655 /* v1 requires a full pass and reformatting. */
656 case CTF_VERSION_1:
657 upgrade_types_v1 (fp, cth);
658 /* FALLTHRU */
659 /* Already-converted v1 is just like later versions except that its
660 parent/child boundary is unchanged (and much lower). */
661
662 case CTF_VERSION_1_UPGRADED_3:
663 fp->ctf_parmax = CTF_MAX_PTYPE_V1;
664
665 /* v2 is just the same as v3 except for new types and sections:
666 no upgrading required. */
667 case CTF_VERSION_2: ;
668 /* FALLTHRU */
669 }
670 return 0;
671 }
672
673 /* Populate statically-defined types (those loaded from a saved buffer).
674
675 Initialize the type ID translation table with the byte offset of each type,
676 and initialize the hash tables of each named type. Upgrade the type table to
677 the latest supported representation in the process, if needed, and if this
678 recension of libctf supports upgrading. */
679
680 static int
681 init_static_types (ctf_dict_t *fp, ctf_header_t *cth)
682 {
683 const ctf_type_t *tbuf;
684 const ctf_type_t *tend;
685
686 unsigned long pop[CTF_K_MAX + 1] = { 0 };
687 const ctf_type_t *tp;
688 uint32_t id;
689 uint32_t *xp;
690 unsigned long typemax = 0;
691
692 /* We determine whether the dict is a child or a parent based on the value of
693 cth_parname. */
694
695 int child = cth->cth_parname != 0;
696 int nlstructs = 0, nlunions = 0;
697 int err;
698
699 if (_libctf_unlikely_ (fp->ctf_version == CTF_VERSION_1))
700 {
701 int err;
702 if ((err = upgrade_types (fp, cth)) != 0)
703 return err; /* Upgrade failed. */
704 }
705
706 tbuf = (ctf_type_t *) (fp->ctf_buf + cth->cth_typeoff);
707 tend = (ctf_type_t *) (fp->ctf_buf + cth->cth_stroff);
708
709 /* We make two passes through the entire type section. In this first
710 pass, we count the number of each type and the total number of types. */
711
712 for (tp = tbuf; tp < tend; typemax++)
713 {
714 unsigned short kind = LCTF_INFO_KIND (fp, tp->ctt_info);
715 unsigned long vlen = LCTF_INFO_VLEN (fp, tp->ctt_info);
716 ssize_t size, increment, vbytes;
717
718 (void) ctf_get_ctt_size (fp, tp, &size, &increment);
719 vbytes = LCTF_VBYTES (fp, kind, size, vlen);
720
721 if (vbytes < 0)
722 return ECTF_CORRUPT;
723
724 /* For forward declarations, ctt_type is the CTF_K_* kind for the tag,
725 so bump that population count too. */
726 if (kind == CTF_K_FORWARD)
727 pop[tp->ctt_type]++;
728
729 tp = (ctf_type_t *) ((uintptr_t) tp + increment + vbytes);
730 pop[kind]++;
731 }
732
733 if (child)
734 {
735 ctf_dprintf ("CTF dict %p is a child\n", (void *) fp);
736 fp->ctf_flags |= LCTF_CHILD;
737 }
738 else
739 ctf_dprintf ("CTF dict %p is a parent\n", (void *) fp);
740
741 /* Now that we've counted up the number of each type, we can allocate
742 the hash tables, type translation table, and pointer table. */
743
744 if ((fp->ctf_structs
745 = ctf_dynhash_create_sized (pop[CTF_K_STRUCT], ctf_hash_string,
746 ctf_hash_eq_string, NULL, NULL)) == NULL)
747 return ENOMEM;
748
749 if ((fp->ctf_unions
750 = ctf_dynhash_create_sized (pop[CTF_K_UNION], ctf_hash_string,
751 ctf_hash_eq_string, NULL, NULL)) == NULL)
752 return ENOMEM;
753
754 if ((fp->ctf_enums
755 = ctf_dynhash_create_sized (pop[CTF_K_ENUM], ctf_hash_string,
756 ctf_hash_eq_string, NULL, NULL)) == NULL)
757 return ENOMEM;
758
759 if ((fp->ctf_names
760 = ctf_dynhash_create_sized (pop[CTF_K_UNKNOWN] +
761 pop[CTF_K_INTEGER] +
762 pop[CTF_K_FLOAT] +
763 pop[CTF_K_FUNCTION] +
764 pop[CTF_K_TYPEDEF] +
765 pop[CTF_K_POINTER] +
766 pop[CTF_K_VOLATILE] +
767 pop[CTF_K_CONST] +
768 pop[CTF_K_RESTRICT],
769 ctf_hash_string,
770 ctf_hash_eq_string, NULL, NULL)) == NULL)
771 return ENOMEM;
772
773 /* The ptrtab and txlate can be appropriately sized for precisely this set
774 of types: the txlate because it is only used to look up static types,
775 so dynamic types added later will never go through it, and the ptrtab
776 because later-added types will call grow_ptrtab() automatically, as
777 needed. */
778
779 fp->ctf_txlate = malloc (sizeof (uint32_t) * (typemax + 1));
780 fp->ctf_ptrtab_len = typemax + 1;
781 fp->ctf_ptrtab = malloc (sizeof (uint32_t) * fp->ctf_ptrtab_len);
782 fp->ctf_stypes = typemax;
783
784 if (fp->ctf_txlate == NULL || fp->ctf_ptrtab == NULL)
785 return ENOMEM; /* Memory allocation failed. */
786
787 xp = fp->ctf_txlate;
788 *xp++ = 0; /* Type id 0 is used as a sentinel value. */
789
790 memset (fp->ctf_txlate, 0, sizeof (uint32_t) * (typemax + 1));
791 memset (fp->ctf_ptrtab, 0, sizeof (uint32_t) * (typemax + 1));
792
793 /* In the second pass through the types, we fill in each entry of the
794 type and pointer tables and add names to the appropriate hashes.
795
796 Bump ctf_typemax as we go, but keep it one higher than normal, so that
797 the type being read in is considered a valid type and it is at least
798 barely possible to run simple lookups on it. */
799
800 for (id = 1, fp->ctf_typemax = 1, tp = tbuf; tp < tend; xp++, id++, fp->ctf_typemax++)
801 {
802 unsigned short kind = LCTF_INFO_KIND (fp, tp->ctt_info);
803 unsigned short isroot = LCTF_INFO_ISROOT (fp, tp->ctt_info);
804 unsigned long vlen = LCTF_INFO_VLEN (fp, tp->ctt_info);
805 ssize_t size, increment, vbytes;
806
807 const char *name;
808
809 (void) ctf_get_ctt_size (fp, tp, &size, &increment);
810 name = ctf_strptr (fp, tp->ctt_name);
811 /* Cannot fail: shielded by call in loop above. */
812 vbytes = LCTF_VBYTES (fp, kind, size, vlen);
813
814 *xp = (uint32_t) ((uintptr_t) tp - (uintptr_t) fp->ctf_buf);
815
816 switch (kind)
817 {
818 case CTF_K_UNKNOWN:
819 case CTF_K_INTEGER:
820 case CTF_K_FLOAT:
821 {
822 ctf_id_t existing;
823 ctf_encoding_t existing_en;
824 ctf_encoding_t this_en;
825
826 if (!isroot)
827 break;
828
829 /* Names are reused by bitfields, which are differentiated by
830 their encodings. So check for the type already existing, and
831 iff the new type is a root-visible non-bitfield, replace the
832 old one. It's a little hard to figure out whether a type is
833 a non-bitfield without already knowing that type's native
834 width, but we can converge on it by replacing an existing
835 type as long as the new type is zero-offset and has a
836 bit-width wider than the existing one, since the native type
837 must necessarily have a bit-width at least as wide as any
838 bitfield based on it. */
839
840 if (((existing = ctf_dynhash_lookup_type (fp->ctf_names, name)) == 0)
841 || ctf_type_encoding (fp, existing, &existing_en) != 0
842 || (ctf_type_encoding (fp, LCTF_INDEX_TO_TYPE (fp, id, child), &this_en) == 0
843 && this_en.cte_offset == 0
844 && (existing_en.cte_offset != 0
845 || existing_en.cte_bits < this_en.cte_bits)))
846 {
847 err = ctf_dynhash_insert_type (fp, fp->ctf_names,
848 LCTF_INDEX_TO_TYPE (fp, id, child),
849 tp->ctt_name);
850 if (err != 0)
851 return err;
852 }
853 break;
854 }
855
856 /* These kinds have no name, so do not need interning into any
857 hashtables. */
858 case CTF_K_ARRAY:
859 case CTF_K_SLICE:
860 break;
861
862 case CTF_K_FUNCTION:
863 if (!isroot)
864 break;
865
866 err = ctf_dynhash_insert_type (fp, fp->ctf_names,
867 LCTF_INDEX_TO_TYPE (fp, id, child),
868 tp->ctt_name);
869 if (err != 0)
870 return err;
871 break;
872
873 case CTF_K_STRUCT:
874 if (size >= CTF_LSTRUCT_THRESH)
875 nlstructs++;
876
877 if (!isroot)
878 break;
879
880 err = ctf_dynhash_insert_type (fp, fp->ctf_structs,
881 LCTF_INDEX_TO_TYPE (fp, id, child),
882 tp->ctt_name);
883
884 if (err != 0)
885 return err;
886
887 break;
888
889 case CTF_K_UNION:
890 if (size >= CTF_LSTRUCT_THRESH)
891 nlunions++;
892
893 if (!isroot)
894 break;
895
896 err = ctf_dynhash_insert_type (fp, fp->ctf_unions,
897 LCTF_INDEX_TO_TYPE (fp, id, child),
898 tp->ctt_name);
899
900 if (err != 0)
901 return err;
902 break;
903
904 case CTF_K_ENUM:
905 if (!isroot)
906 break;
907
908 err = ctf_dynhash_insert_type (fp, fp->ctf_enums,
909 LCTF_INDEX_TO_TYPE (fp, id, child),
910 tp->ctt_name);
911
912 if (err != 0)
913 return err;
914 break;
915
916 case CTF_K_TYPEDEF:
917 if (!isroot)
918 break;
919
920 err = ctf_dynhash_insert_type (fp, fp->ctf_names,
921 LCTF_INDEX_TO_TYPE (fp, id, child),
922 tp->ctt_name);
923 if (err != 0)
924 return err;
925 break;
926
927 case CTF_K_FORWARD:
928 {
929 ctf_dynhash_t *h = ctf_name_table (fp, tp->ctt_type);
930
931 if (!isroot)
932 break;
933
934 /* Only insert forward tags into the given hash if the type or tag
935 name is not already present. */
936 if (ctf_dynhash_lookup_type (h, name) == 0)
937 {
938 err = ctf_dynhash_insert_type (fp, h, LCTF_INDEX_TO_TYPE (fp, id, child),
939 tp->ctt_name);
940 if (err != 0)
941 return err;
942 }
943 break;
944 }
945
946 case CTF_K_POINTER:
947 /* If the type referenced by the pointer is in this CTF dict, then
948 store the index of the pointer type in fp->ctf_ptrtab[ index of
949 referenced type ]. */
950
951 if (LCTF_TYPE_ISCHILD (fp, tp->ctt_type) == child
952 && LCTF_TYPE_TO_INDEX (fp, tp->ctt_type) <= fp->ctf_typemax)
953 fp->ctf_ptrtab[LCTF_TYPE_TO_INDEX (fp, tp->ctt_type)] = id;
954 /*FALLTHRU*/
955
956 case CTF_K_VOLATILE:
957 case CTF_K_CONST:
958 case CTF_K_RESTRICT:
959 if (!isroot)
960 break;
961
962 err = ctf_dynhash_insert_type (fp, fp->ctf_names,
963 LCTF_INDEX_TO_TYPE (fp, id, child),
964 tp->ctt_name);
965 if (err != 0)
966 return err;
967 break;
968 default:
969 ctf_err_warn (fp, 0, ECTF_CORRUPT,
970 _("init_static_types(): unhandled CTF kind: %x"), kind);
971 return ECTF_CORRUPT;
972 }
973 tp = (ctf_type_t *) ((uintptr_t) tp + increment + vbytes);
974 }
975 fp->ctf_typemax--;
976 assert (fp->ctf_typemax == typemax);
977
978 ctf_dprintf ("%lu total types processed\n", fp->ctf_typemax);
979 ctf_dprintf ("%zu enum names hashed\n",
980 ctf_dynhash_elements (fp->ctf_enums));
981 ctf_dprintf ("%zu struct names hashed (%d long)\n",
982 ctf_dynhash_elements (fp->ctf_structs), nlstructs);
983 ctf_dprintf ("%zu union names hashed (%d long)\n",
984 ctf_dynhash_elements (fp->ctf_unions), nlunions);
985 ctf_dprintf ("%zu base type names hashed\n",
986 ctf_dynhash_elements (fp->ctf_names));
987
988 return 0;
989 }
990
991 /* Endianness-flipping routines.
992
993 We flip everything, mindlessly, even 1-byte entities, so that future
994 expansions do not require changes to this code. */
995
996 /* Flip the endianness of the CTF header. */
997
998 void
999 ctf_flip_header (ctf_header_t *cth)
1000 {
1001 swap_thing (cth->cth_preamble.ctp_magic);
1002 swap_thing (cth->cth_preamble.ctp_version);
1003 swap_thing (cth->cth_preamble.ctp_flags);
1004 swap_thing (cth->cth_parlabel);
1005 swap_thing (cth->cth_parname);
1006 swap_thing (cth->cth_cuname);
1007 swap_thing (cth->cth_objtoff);
1008 swap_thing (cth->cth_funcoff);
1009 swap_thing (cth->cth_objtidxoff);
1010 swap_thing (cth->cth_funcidxoff);
1011 swap_thing (cth->cth_varoff);
1012 swap_thing (cth->cth_typeoff);
1013 swap_thing (cth->cth_stroff);
1014 swap_thing (cth->cth_strlen);
1015 }
1016
1017 /* Flip the endianness of the label section, an array of ctf_lblent_t. */
1018
1019 static void
1020 flip_lbls (void *start, size_t len)
1021 {
1022 ctf_lblent_t *lbl = start;
1023 ssize_t i;
1024
1025 for (i = len / sizeof (struct ctf_lblent); i > 0; lbl++, i--)
1026 {
1027 swap_thing (lbl->ctl_label);
1028 swap_thing (lbl->ctl_type);
1029 }
1030 }
1031
1032 /* Flip the endianness of the data-object or function sections or their indexes,
1033 all arrays of uint32_t. */
1034
1035 static void
1036 flip_objts (void *start, size_t len)
1037 {
1038 uint32_t *obj = start;
1039 ssize_t i;
1040
1041 for (i = len / sizeof (uint32_t); i > 0; obj++, i--)
1042 swap_thing (*obj);
1043 }
1044
1045 /* Flip the endianness of the variable section, an array of ctf_varent_t. */
1046
1047 static void
1048 flip_vars (void *start, size_t len)
1049 {
1050 ctf_varent_t *var = start;
1051 ssize_t i;
1052
1053 for (i = len / sizeof (struct ctf_varent); i > 0; var++, i--)
1054 {
1055 swap_thing (var->ctv_name);
1056 swap_thing (var->ctv_type);
1057 }
1058 }
1059
1060 /* Flip the endianness of the type section, a tagged array of ctf_type or
1061 ctf_stype followed by variable data. */
1062
1063 static int
1064 flip_types (ctf_dict_t *fp, void *start, size_t len, int to_foreign)
1065 {
1066 ctf_type_t *t = start;
1067
1068 while ((uintptr_t) t < ((uintptr_t) start) + len)
1069 {
1070 uint32_t kind;
1071 size_t size;
1072 uint32_t vlen;
1073 size_t vbytes;
1074
1075 if (to_foreign)
1076 {
1077 kind = CTF_V2_INFO_KIND (t->ctt_info);
1078 size = t->ctt_size;
1079 vlen = CTF_V2_INFO_VLEN (t->ctt_info);
1080 vbytes = get_vbytes_v2 (fp, kind, size, vlen);
1081 }
1082
1083 swap_thing (t->ctt_name);
1084 swap_thing (t->ctt_info);
1085 swap_thing (t->ctt_size);
1086
1087 if (!to_foreign)
1088 {
1089 kind = CTF_V2_INFO_KIND (t->ctt_info);
1090 size = t->ctt_size;
1091 vlen = CTF_V2_INFO_VLEN (t->ctt_info);
1092 vbytes = get_vbytes_v2 (fp, kind, size, vlen);
1093 }
1094
1095 if (_libctf_unlikely_ (size == CTF_LSIZE_SENT))
1096 {
1097 if (to_foreign)
1098 size = CTF_TYPE_LSIZE (t);
1099
1100 swap_thing (t->ctt_lsizehi);
1101 swap_thing (t->ctt_lsizelo);
1102
1103 if (!to_foreign)
1104 size = CTF_TYPE_LSIZE (t);
1105
1106 t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_type_t));
1107 }
1108 else
1109 t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_stype_t));
1110
1111 switch (kind)
1112 {
1113 case CTF_K_FORWARD:
1114 case CTF_K_UNKNOWN:
1115 case CTF_K_POINTER:
1116 case CTF_K_TYPEDEF:
1117 case CTF_K_VOLATILE:
1118 case CTF_K_CONST:
1119 case CTF_K_RESTRICT:
1120 /* These types have no vlen data to swap. */
1121 assert (vbytes == 0);
1122 break;
1123
1124 case CTF_K_INTEGER:
1125 case CTF_K_FLOAT:
1126 {
1127 /* These types have a single uint32_t. */
1128
1129 uint32_t *item = (uint32_t *) t;
1130
1131 swap_thing (*item);
1132 break;
1133 }
1134
1135 case CTF_K_FUNCTION:
1136 {
1137 /* This type has a bunch of uint32_ts. */
1138
1139 uint32_t *item = (uint32_t *) t;
1140 ssize_t i;
1141
1142 for (i = vlen; i > 0; item++, i--)
1143 swap_thing (*item);
1144 break;
1145 }
1146
1147 case CTF_K_ARRAY:
1148 {
1149 /* This has a single ctf_array_t. */
1150
1151 ctf_array_t *a = (ctf_array_t *) t;
1152
1153 assert (vbytes == sizeof (ctf_array_t));
1154 swap_thing (a->cta_contents);
1155 swap_thing (a->cta_index);
1156 swap_thing (a->cta_nelems);
1157
1158 break;
1159 }
1160
1161 case CTF_K_SLICE:
1162 {
1163 /* This has a single ctf_slice_t. */
1164
1165 ctf_slice_t *s = (ctf_slice_t *) t;
1166
1167 assert (vbytes == sizeof (ctf_slice_t));
1168 swap_thing (s->cts_type);
1169 swap_thing (s->cts_offset);
1170 swap_thing (s->cts_bits);
1171
1172 break;
1173 }
1174
1175 case CTF_K_STRUCT:
1176 case CTF_K_UNION:
1177 {
1178 /* This has an array of ctf_member or ctf_lmember, depending on
1179 size. We could consider it to be a simple array of uint32_t,
1180 but for safety's sake in case these structures ever acquire
1181 non-uint32_t members, do it member by member. */
1182
1183 if (_libctf_unlikely_ (size >= CTF_LSTRUCT_THRESH))
1184 {
1185 ctf_lmember_t *lm = (ctf_lmember_t *) t;
1186 ssize_t i;
1187 for (i = vlen; i > 0; i--, lm++)
1188 {
1189 swap_thing (lm->ctlm_name);
1190 swap_thing (lm->ctlm_offsethi);
1191 swap_thing (lm->ctlm_type);
1192 swap_thing (lm->ctlm_offsetlo);
1193 }
1194 }
1195 else
1196 {
1197 ctf_member_t *m = (ctf_member_t *) t;
1198 ssize_t i;
1199 for (i = vlen; i > 0; i--, m++)
1200 {
1201 swap_thing (m->ctm_name);
1202 swap_thing (m->ctm_offset);
1203 swap_thing (m->ctm_type);
1204 }
1205 }
1206 break;
1207 }
1208
1209 case CTF_K_ENUM:
1210 {
1211 /* This has an array of ctf_enum_t. */
1212
1213 ctf_enum_t *item = (ctf_enum_t *) t;
1214 ssize_t i;
1215
1216 for (i = vlen; i > 0; item++, i--)
1217 {
1218 swap_thing (item->cte_name);
1219 swap_thing (item->cte_value);
1220 }
1221 break;
1222 }
1223 default:
1224 ctf_err_warn (fp, 0, ECTF_CORRUPT,
1225 _("unhandled CTF kind in endianness conversion: %x"),
1226 kind);
1227 return ECTF_CORRUPT;
1228 }
1229
1230 t = (ctf_type_t *) ((uintptr_t) t + vbytes);
1231 }
1232
1233 return 0;
1234 }
1235
1236 /* Flip the endianness of BUF, given the offsets in the (native-endianness) CTH.
1237 If TO_FOREIGN is set, flip to foreign-endianness; if not, flip away.
1238
1239 All of this stuff happens before the header is fully initialized, so the
1240 LCTF_*() macros cannot be used yet. Since we do not try to endian-convert v1
1241 data, this is no real loss. */
1242
1243 int
1244 ctf_flip (ctf_dict_t *fp, ctf_header_t *cth, unsigned char *buf,
1245 int to_foreign)
1246 {
1247 ctf_dprintf("flipping endianness\n");
1248
1249 flip_lbls (buf + cth->cth_lbloff, cth->cth_objtoff - cth->cth_lbloff);
1250 flip_objts (buf + cth->cth_objtoff, cth->cth_funcoff - cth->cth_objtoff);
1251 flip_objts (buf + cth->cth_funcoff, cth->cth_objtidxoff - cth->cth_funcoff);
1252 flip_objts (buf + cth->cth_objtidxoff, cth->cth_funcidxoff - cth->cth_objtidxoff);
1253 flip_objts (buf + cth->cth_funcidxoff, cth->cth_varoff - cth->cth_funcidxoff);
1254 flip_vars (buf + cth->cth_varoff, cth->cth_typeoff - cth->cth_varoff);
1255 return flip_types (fp, buf + cth->cth_typeoff,
1256 cth->cth_stroff - cth->cth_typeoff, to_foreign);
1257 }
1258
1259 /* Set up the ctl hashes in a ctf_dict_t. Called by both writable and
1260 non-writable dictionary initialization. */
1261 void ctf_set_ctl_hashes (ctf_dict_t *fp)
1262 {
1263 /* Initialize the ctf_lookup_by_name top-level dictionary. We keep an
1264 array of type name prefixes and the corresponding ctf_hash to use. */
1265 fp->ctf_lookups[0].ctl_prefix = "struct";
1266 fp->ctf_lookups[0].ctl_len = strlen (fp->ctf_lookups[0].ctl_prefix);
1267 fp->ctf_lookups[0].ctl_hash = fp->ctf_structs;
1268 fp->ctf_lookups[1].ctl_prefix = "union";
1269 fp->ctf_lookups[1].ctl_len = strlen (fp->ctf_lookups[1].ctl_prefix);
1270 fp->ctf_lookups[1].ctl_hash = fp->ctf_unions;
1271 fp->ctf_lookups[2].ctl_prefix = "enum";
1272 fp->ctf_lookups[2].ctl_len = strlen (fp->ctf_lookups[2].ctl_prefix);
1273 fp->ctf_lookups[2].ctl_hash = fp->ctf_enums;
1274 fp->ctf_lookups[3].ctl_prefix = _CTF_NULLSTR;
1275 fp->ctf_lookups[3].ctl_len = strlen (fp->ctf_lookups[3].ctl_prefix);
1276 fp->ctf_lookups[3].ctl_hash = fp->ctf_names;
1277 fp->ctf_lookups[4].ctl_prefix = NULL;
1278 fp->ctf_lookups[4].ctl_len = 0;
1279 fp->ctf_lookups[4].ctl_hash = NULL;
1280 }
1281
1282 /* Open a CTF file, mocking up a suitable ctf_sect. */
1283
1284 ctf_dict_t *ctf_simple_open (const char *ctfsect, size_t ctfsect_size,
1285 const char *symsect, size_t symsect_size,
1286 size_t symsect_entsize,
1287 const char *strsect, size_t strsect_size,
1288 int *errp)
1289 {
1290 ctf_sect_t skeleton;
1291
1292 ctf_sect_t ctf_sect, sym_sect, str_sect;
1293 ctf_sect_t *ctfsectp = NULL;
1294 ctf_sect_t *symsectp = NULL;
1295 ctf_sect_t *strsectp = NULL;
1296
1297 skeleton.cts_name = _CTF_SECTION;
1298 skeleton.cts_entsize = 1;
1299
1300 if (ctfsect)
1301 {
1302 memcpy (&ctf_sect, &skeleton, sizeof (struct ctf_sect));
1303 ctf_sect.cts_data = ctfsect;
1304 ctf_sect.cts_size = ctfsect_size;
1305 ctfsectp = &ctf_sect;
1306 }
1307
1308 if (symsect)
1309 {
1310 memcpy (&sym_sect, &skeleton, sizeof (struct ctf_sect));
1311 sym_sect.cts_data = symsect;
1312 sym_sect.cts_size = symsect_size;
1313 sym_sect.cts_entsize = symsect_entsize;
1314 symsectp = &sym_sect;
1315 }
1316
1317 if (strsect)
1318 {
1319 memcpy (&str_sect, &skeleton, sizeof (struct ctf_sect));
1320 str_sect.cts_data = strsect;
1321 str_sect.cts_size = strsect_size;
1322 strsectp = &str_sect;
1323 }
1324
1325 return ctf_bufopen (ctfsectp, symsectp, strsectp, errp);
1326 }
1327
1328 /* Decode the specified CTF buffer and optional symbol table, and create a new
1329 CTF dict representing the symbolic debugging information. This code can
1330 be used directly by the debugger, or it can be used as the engine for
1331 ctf_fdopen() or ctf_open(), below. */
1332
1333 ctf_dict_t *
1334 ctf_bufopen (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
1335 const ctf_sect_t *strsect, int *errp)
1336 {
1337 const ctf_preamble_t *pp;
1338 size_t hdrsz = sizeof (ctf_header_t);
1339 ctf_header_t *hp;
1340 ctf_dict_t *fp;
1341 int foreign_endian = 0;
1342 int err;
1343
1344 libctf_init_debug();
1345
1346 if ((ctfsect == NULL) || ((symsect != NULL) && (strsect == NULL)))
1347 return (ctf_set_open_errno (errp, EINVAL));
1348
1349 if (symsect != NULL && symsect->cts_entsize != sizeof (Elf32_Sym) &&
1350 symsect->cts_entsize != sizeof (Elf64_Sym))
1351 return (ctf_set_open_errno (errp, ECTF_SYMTAB));
1352
1353 if (symsect != NULL && symsect->cts_data == NULL)
1354 return (ctf_set_open_errno (errp, ECTF_SYMBAD));
1355
1356 if (strsect != NULL && strsect->cts_data == NULL)
1357 return (ctf_set_open_errno (errp, ECTF_STRBAD));
1358
1359 if (ctfsect->cts_data == NULL
1360 || ctfsect->cts_size < sizeof (ctf_preamble_t))
1361 return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1362
1363 pp = (const ctf_preamble_t *) ctfsect->cts_data;
1364
1365 ctf_dprintf ("ctf_bufopen: magic=0x%x version=%u\n",
1366 pp->ctp_magic, pp->ctp_version);
1367
1368 /* Validate each part of the CTF header.
1369
1370 First, we validate the preamble (common to all versions). At that point,
1371 we know the endianness and specific header version, and can validate the
1372 version-specific parts including section offsets and alignments.
1373
1374 We specifically do not support foreign-endian old versions. */
1375
1376 if (_libctf_unlikely_ (pp->ctp_magic != CTF_MAGIC))
1377 {
1378 if (pp->ctp_magic == bswap_16 (CTF_MAGIC))
1379 {
1380 if (pp->ctp_version != CTF_VERSION_3)
1381 return (ctf_set_open_errno (errp, ECTF_CTFVERS));
1382 foreign_endian = 1;
1383 }
1384 else
1385 return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1386 }
1387
1388 if (_libctf_unlikely_ ((pp->ctp_version < CTF_VERSION_1)
1389 || (pp->ctp_version > CTF_VERSION_3)))
1390 return (ctf_set_open_errno (errp, ECTF_CTFVERS));
1391
1392 if ((symsect != NULL) && (pp->ctp_version < CTF_VERSION_2))
1393 {
1394 /* The symtab can contain function entries which contain embedded ctf
1395 info. We do not support dynamically upgrading such entries (none
1396 should exist in any case, since dwarf2ctf does not create them). */
1397
1398 ctf_err_warn (NULL, 0, ECTF_NOTSUP, _("ctf_bufopen: CTF version %d "
1399 "symsect not supported"),
1400 pp->ctp_version);
1401 return (ctf_set_open_errno (errp, ECTF_NOTSUP));
1402 }
1403
1404 if (pp->ctp_version < CTF_VERSION_3)
1405 hdrsz = sizeof (ctf_header_v2_t);
1406
1407 if (_libctf_unlikely_ (pp->ctp_flags > CTF_F_MAX))
1408 {
1409 ctf_err_warn (NULL, 0, ECTF_FLAGS, _("ctf_bufopen: invalid header "
1410 "flags: %x"),
1411 (unsigned int) pp->ctp_flags);
1412 return (ctf_set_open_errno (errp, ECTF_FLAGS));
1413 }
1414
1415 if (ctfsect->cts_size < hdrsz)
1416 return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1417
1418 if ((fp = malloc (sizeof (ctf_dict_t))) == NULL)
1419 return (ctf_set_open_errno (errp, ENOMEM));
1420
1421 memset (fp, 0, sizeof (ctf_dict_t));
1422
1423 if ((fp->ctf_header = malloc (sizeof (struct ctf_header))) == NULL)
1424 {
1425 free (fp);
1426 return (ctf_set_open_errno (errp, ENOMEM));
1427 }
1428 hp = fp->ctf_header;
1429 memcpy (hp, ctfsect->cts_data, hdrsz);
1430 if (pp->ctp_version < CTF_VERSION_3)
1431 upgrade_header (hp);
1432
1433 if (foreign_endian)
1434 ctf_flip_header (hp);
1435 fp->ctf_openflags = hp->cth_flags;
1436 fp->ctf_size = hp->cth_stroff + hp->cth_strlen;
1437
1438 ctf_dprintf ("ctf_bufopen: uncompressed size=%lu\n",
1439 (unsigned long) fp->ctf_size);
1440
1441 if (hp->cth_lbloff > fp->ctf_size || hp->cth_objtoff > fp->ctf_size
1442 || hp->cth_funcoff > fp->ctf_size || hp->cth_objtidxoff > fp->ctf_size
1443 || hp->cth_funcidxoff > fp->ctf_size || hp->cth_typeoff > fp->ctf_size
1444 || hp->cth_stroff > fp->ctf_size)
1445 {
1446 ctf_err_warn (NULL, 0, ECTF_CORRUPT, _("header offset exceeds CTF size"));
1447 return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1448 }
1449
1450 if (hp->cth_lbloff > hp->cth_objtoff
1451 || hp->cth_objtoff > hp->cth_funcoff
1452 || hp->cth_funcoff > hp->cth_typeoff
1453 || hp->cth_funcoff > hp->cth_objtidxoff
1454 || hp->cth_objtidxoff > hp->cth_funcidxoff
1455 || hp->cth_funcidxoff > hp->cth_varoff
1456 || hp->cth_varoff > hp->cth_typeoff || hp->cth_typeoff > hp->cth_stroff)
1457 {
1458 ctf_err_warn (NULL, 0, ECTF_CORRUPT, _("overlapping CTF sections"));
1459 return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1460 }
1461
1462 if ((hp->cth_lbloff & 3) || (hp->cth_objtoff & 2)
1463 || (hp->cth_funcoff & 2) || (hp->cth_objtidxoff & 2)
1464 || (hp->cth_funcidxoff & 2) || (hp->cth_varoff & 3)
1465 || (hp->cth_typeoff & 3))
1466 {
1467 ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1468 _("CTF sections not properly aligned"));
1469 return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1470 }
1471
1472 /* This invariant will be lifted in v4, but for now it is true. */
1473
1474 if ((hp->cth_funcidxoff - hp->cth_objtidxoff != 0) &&
1475 (hp->cth_funcidxoff - hp->cth_objtidxoff
1476 != hp->cth_funcoff - hp->cth_objtoff))
1477 {
1478 ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1479 _("Object index section is neither empty nor the "
1480 "same length as the object section: %u versus %u "
1481 "bytes"), hp->cth_funcoff - hp->cth_objtoff,
1482 hp->cth_funcidxoff - hp->cth_objtidxoff);
1483 return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1484 }
1485
1486 if ((hp->cth_varoff - hp->cth_funcidxoff != 0) &&
1487 (hp->cth_varoff - hp->cth_funcidxoff
1488 != hp->cth_objtidxoff - hp->cth_funcoff) &&
1489 (hp->cth_flags & CTF_F_NEWFUNCINFO))
1490 {
1491 ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1492 _("Function index section is neither empty nor the "
1493 "same length as the function section: %u versus %u "
1494 "bytes"), hp->cth_objtidxoff - hp->cth_funcoff,
1495 hp->cth_varoff - hp->cth_funcidxoff);
1496 return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1497 }
1498
1499 /* Once everything is determined to be valid, attempt to decompress the CTF
1500 data buffer if it is compressed, or copy it into new storage if it is not
1501 compressed but needs endian-flipping. Otherwise we just put the data
1502 section's buffer pointer into ctf_buf, below. */
1503
1504 /* Note: if this is a v1 buffer, it will be reallocated and expanded by
1505 init_static_types(). */
1506
1507 if (hp->cth_flags & CTF_F_COMPRESS)
1508 {
1509 size_t srclen;
1510 uLongf dstlen;
1511 const void *src;
1512 int rc = Z_OK;
1513
1514 /* We are allocating this ourselves, so we can drop the ctf header
1515 copy in favour of ctf->ctf_header. */
1516
1517 if ((fp->ctf_base = malloc (fp->ctf_size)) == NULL)
1518 {
1519 err = ECTF_ZALLOC;
1520 goto bad;
1521 }
1522 fp->ctf_dynbase = fp->ctf_base;
1523 hp->cth_flags &= ~CTF_F_COMPRESS;
1524
1525 src = (unsigned char *) ctfsect->cts_data + hdrsz;
1526 srclen = ctfsect->cts_size - hdrsz;
1527 dstlen = fp->ctf_size;
1528 fp->ctf_buf = fp->ctf_base;
1529
1530 if ((rc = uncompress (fp->ctf_base, &dstlen, src, srclen)) != Z_OK)
1531 {
1532 ctf_err_warn (NULL, 0, ECTF_DECOMPRESS, _("zlib inflate err: %s"),
1533 zError (rc));
1534 err = ECTF_DECOMPRESS;
1535 goto bad;
1536 }
1537
1538 if ((size_t) dstlen != fp->ctf_size)
1539 {
1540 ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1541 _("zlib inflate short: got %lu of %lu bytes"),
1542 (unsigned long) dstlen, (unsigned long) fp->ctf_size);
1543 err = ECTF_CORRUPT;
1544 goto bad;
1545 }
1546 }
1547 else
1548 {
1549 if (_libctf_unlikely_ (ctfsect->cts_size < hdrsz + fp->ctf_size))
1550 {
1551 ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1552 _("%lu byte long CTF dictionary overruns %lu byte long CTF section"),
1553 (unsigned long) ctfsect->cts_size,
1554 (unsigned long) (hdrsz + fp->ctf_size));
1555 err = ECTF_CORRUPT;
1556 goto bad;
1557 }
1558
1559 if (foreign_endian)
1560 {
1561 if ((fp->ctf_base = malloc (fp->ctf_size)) == NULL)
1562 {
1563 err = ECTF_ZALLOC;
1564 goto bad;
1565 }
1566 fp->ctf_dynbase = fp->ctf_base;
1567 memcpy (fp->ctf_base, ((unsigned char *) ctfsect->cts_data) + hdrsz,
1568 fp->ctf_size);
1569 fp->ctf_buf = fp->ctf_base;
1570 }
1571 else
1572 {
1573 /* We are just using the section passed in -- but its header may
1574 be an old version. Point ctf_buf past the old header, and
1575 never touch it again. */
1576 fp->ctf_base = (unsigned char *) ctfsect->cts_data;
1577 fp->ctf_dynbase = NULL;
1578 fp->ctf_buf = fp->ctf_base + hdrsz;
1579 }
1580 }
1581
1582 /* Once we have uncompressed and validated the CTF data buffer, we can
1583 proceed with initializing the ctf_dict_t we allocated above.
1584
1585 Nothing that depends on buf or base should be set directly in this function
1586 before the init_static_types() call, because it may be reallocated during
1587 transparent upgrade if this recension of libctf is so configured: see
1588 ctf_set_base(). */
1589
1590 ctf_set_version (fp, hp, hp->cth_version);
1591
1592 /* Temporary assignment, just enough to be able to initialize
1593 the atoms table. */
1594
1595 fp->ctf_str[CTF_STRTAB_0].cts_strs = (const char *) fp->ctf_buf
1596 + hp->cth_stroff;
1597 fp->ctf_str[CTF_STRTAB_0].cts_len = hp->cth_strlen;
1598 if (ctf_str_create_atoms (fp) < 0)
1599 {
1600 err = ENOMEM;
1601 goto bad;
1602 }
1603
1604 fp->ctf_parmax = CTF_MAX_PTYPE;
1605 memcpy (&fp->ctf_data, ctfsect, sizeof (ctf_sect_t));
1606
1607 if (symsect != NULL)
1608 {
1609 memcpy (&fp->ctf_ext_symtab, symsect, sizeof (ctf_sect_t));
1610 memcpy (&fp->ctf_ext_strtab, strsect, sizeof (ctf_sect_t));
1611 }
1612
1613 if (fp->ctf_data.cts_name != NULL)
1614 if ((fp->ctf_data.cts_name = strdup (fp->ctf_data.cts_name)) == NULL)
1615 {
1616 err = ENOMEM;
1617 goto bad;
1618 }
1619 if (fp->ctf_ext_symtab.cts_name != NULL)
1620 if ((fp->ctf_ext_symtab.cts_name = strdup (fp->ctf_ext_symtab.cts_name)) == NULL)
1621 {
1622 err = ENOMEM;
1623 goto bad;
1624 }
1625 if (fp->ctf_ext_strtab.cts_name != NULL)
1626 if ((fp->ctf_ext_strtab.cts_name = strdup (fp->ctf_ext_strtab.cts_name)) == NULL)
1627 {
1628 err = ENOMEM;
1629 goto bad;
1630 }
1631
1632 if (fp->ctf_data.cts_name == NULL)
1633 fp->ctf_data.cts_name = _CTF_NULLSTR;
1634 if (fp->ctf_ext_symtab.cts_name == NULL)
1635 fp->ctf_ext_symtab.cts_name = _CTF_NULLSTR;
1636 if (fp->ctf_ext_strtab.cts_name == NULL)
1637 fp->ctf_ext_strtab.cts_name = _CTF_NULLSTR;
1638
1639 if (strsect != NULL)
1640 {
1641 fp->ctf_str[CTF_STRTAB_1].cts_strs = strsect->cts_data;
1642 fp->ctf_str[CTF_STRTAB_1].cts_len = strsect->cts_size;
1643 }
1644
1645 /* Dynamic state, for dynamic addition to this dict after loading. */
1646
1647 fp->ctf_dthash = ctf_dynhash_create (ctf_hash_integer, ctf_hash_eq_integer,
1648 NULL, NULL);
1649 fp->ctf_dvhash = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
1650 NULL, NULL);
1651 fp->ctf_snapshots = 1;
1652
1653 fp->ctf_objthash = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
1654 free, NULL);
1655 fp->ctf_funchash = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
1656 free, NULL);
1657
1658 if (!fp->ctf_dthash || !fp->ctf_dvhash || !fp->ctf_snapshots ||
1659 !fp->ctf_objthash || !fp->ctf_funchash)
1660 {
1661 err = ENOMEM;
1662 goto bad;
1663 }
1664
1665 if (foreign_endian &&
1666 (err = ctf_flip (fp, hp, fp->ctf_buf, 0)) != 0)
1667 {
1668 /* We can be certain that ctf_flip() will have endian-flipped everything
1669 other than the types table when we return. In particular the header
1670 is fine, so set it, to allow freeing to use the usual code path. */
1671
1672 ctf_set_base (fp, hp, fp->ctf_base);
1673 goto bad;
1674 }
1675
1676 ctf_set_base (fp, hp, fp->ctf_base);
1677
1678 if ((err = init_static_types (fp, hp)) != 0)
1679 goto bad;
1680
1681 /* Allocate and initialize the symtab translation table, pointed to by
1682 ctf_sxlate, and the corresponding index sections. This table may be too
1683 large for the actual size of the object and function info sections: if so,
1684 ctf_nsyms will be adjusted and the excess will never be used. It's
1685 possible to do indexed symbol lookups even without a symbol table, so check
1686 even in that case. Initially, we assume the symtab is native-endian: if it
1687 isn't, the caller will inform us later by calling ctf_symsect_endianness. */
1688 #ifdef WORDS_BIGENDIAN
1689 fp->ctf_symsect_little_endian = 0;
1690 #else
1691 fp->ctf_symsect_little_endian = 1;
1692 #endif
1693
1694 if (symsect != NULL)
1695 {
1696 fp->ctf_nsyms = symsect->cts_size / symsect->cts_entsize;
1697 fp->ctf_sxlate = malloc (fp->ctf_nsyms * sizeof (uint32_t));
1698
1699 if (fp->ctf_sxlate == NULL)
1700 {
1701 err = ENOMEM;
1702 goto bad;
1703 }
1704 }
1705
1706 if ((err = init_symtab (fp, hp, symsect)) != 0)
1707 goto bad;
1708
1709 ctf_set_ctl_hashes (fp);
1710
1711 if (symsect != NULL)
1712 {
1713 if (symsect->cts_entsize == sizeof (Elf64_Sym))
1714 (void) ctf_setmodel (fp, CTF_MODEL_LP64);
1715 else
1716 (void) ctf_setmodel (fp, CTF_MODEL_ILP32);
1717 }
1718 else
1719 (void) ctf_setmodel (fp, CTF_MODEL_NATIVE);
1720
1721 fp->ctf_refcnt = 1;
1722 return fp;
1723
1724 bad:
1725 ctf_set_open_errno (errp, err);
1726 ctf_err_warn_to_open (fp);
1727 /* Without this, the refcnt is zero on entry and ctf_dict_close() won't
1728 actually do anything on the grounds that this is a recursive call via
1729 another dict being closed. */
1730 fp->ctf_refcnt = 1;
1731 ctf_dict_close (fp);
1732 return NULL;
1733 }
1734
1735 /* Bump the refcount on the specified CTF dict, to allow export of ctf_dict_t's
1736 from iterators that open and close the ctf_dict_t around the loop. (This
1737 does not extend their lifetime beyond that of the ctf_archive_t in which they
1738 are contained.) */
1739
1740 void
1741 ctf_ref (ctf_dict_t *fp)
1742 {
1743 fp->ctf_refcnt++;
1744 }
1745
1746 /* Close the specified CTF dict and free associated data structures. Note that
1747 ctf_dict_close() is a reference counted operation: if the specified file is
1748 the parent of other active dict, its reference count will be greater than one
1749 and it will be freed later when no active children exist. */
1750
1751 void
1752 ctf_dict_close (ctf_dict_t *fp)
1753 {
1754 ctf_dtdef_t *dtd, *ntd;
1755 ctf_dvdef_t *dvd, *nvd;
1756 ctf_in_flight_dynsym_t *did, *nid;
1757 ctf_err_warning_t *err, *nerr;
1758
1759 if (fp == NULL)
1760 return; /* Allow ctf_dict_close(NULL) to simplify caller code. */
1761
1762 ctf_dprintf ("ctf_dict_close(%p) refcnt=%u\n", (void *) fp, fp->ctf_refcnt);
1763
1764 if (fp->ctf_refcnt > 1)
1765 {
1766 fp->ctf_refcnt--;
1767 return;
1768 }
1769
1770 /* It is possible to recurse back in here, notably if dicts in the
1771 ctf_link_inputs or ctf_link_outputs cite this dict as a parent without
1772 using ctf_import_unref. Do nothing in that case. */
1773 if (fp->ctf_refcnt == 0)
1774 return;
1775
1776 fp->ctf_refcnt--;
1777 free (fp->ctf_dyncuname);
1778 free (fp->ctf_dynparname);
1779 if (fp->ctf_parent && !fp->ctf_parent_unreffed)
1780 ctf_dict_close (fp->ctf_parent);
1781
1782 for (dtd = ctf_list_next (&fp->ctf_dtdefs); dtd != NULL; dtd = ntd)
1783 {
1784 ntd = ctf_list_next (dtd);
1785 ctf_dtd_delete (fp, dtd);
1786 }
1787 ctf_dynhash_destroy (fp->ctf_dthash);
1788
1789 ctf_dynhash_destroy (fp->ctf_structs);
1790 ctf_dynhash_destroy (fp->ctf_unions);
1791 ctf_dynhash_destroy (fp->ctf_enums);
1792 ctf_dynhash_destroy (fp->ctf_names);
1793
1794 for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
1795 {
1796 nvd = ctf_list_next (dvd);
1797 ctf_dvd_delete (fp, dvd);
1798 }
1799 ctf_dynhash_destroy (fp->ctf_dvhash);
1800
1801 ctf_dynhash_destroy (fp->ctf_symhash_func);
1802 ctf_dynhash_destroy (fp->ctf_symhash_objt);
1803 free (fp->ctf_funcidx_sxlate);
1804 free (fp->ctf_objtidx_sxlate);
1805 ctf_dynhash_destroy (fp->ctf_objthash);
1806 ctf_dynhash_destroy (fp->ctf_funchash);
1807 free (fp->ctf_dynsymidx);
1808 ctf_dynhash_destroy (fp->ctf_dynsyms);
1809 for (did = ctf_list_next (&fp->ctf_in_flight_dynsyms); did != NULL; did = nid)
1810 {
1811 nid = ctf_list_next (did);
1812 ctf_list_delete (&fp->ctf_in_flight_dynsyms, did);
1813 free (did);
1814 }
1815
1816 ctf_str_free_atoms (fp);
1817 free (fp->ctf_tmp_typeslice);
1818
1819 if (fp->ctf_data.cts_name != _CTF_NULLSTR)
1820 free ((char *) fp->ctf_data.cts_name);
1821
1822 if (fp->ctf_ext_symtab.cts_name != _CTF_NULLSTR)
1823 free ((char *) fp->ctf_ext_symtab.cts_name);
1824
1825 if (fp->ctf_ext_strtab.cts_name != _CTF_NULLSTR)
1826 free ((char *) fp->ctf_ext_strtab.cts_name);
1827 else if (fp->ctf_data_mmapped)
1828 ctf_munmap (fp->ctf_data_mmapped, fp->ctf_data_mmapped_len);
1829
1830 free (fp->ctf_dynbase);
1831
1832 ctf_dynhash_destroy (fp->ctf_syn_ext_strtab);
1833 ctf_dynhash_destroy (fp->ctf_link_inputs);
1834 ctf_dynhash_destroy (fp->ctf_link_outputs);
1835 ctf_dynhash_destroy (fp->ctf_link_type_mapping);
1836 ctf_dynhash_destroy (fp->ctf_link_in_cu_mapping);
1837 ctf_dynhash_destroy (fp->ctf_link_out_cu_mapping);
1838 ctf_dynhash_destroy (fp->ctf_add_processing);
1839 ctf_dedup_fini (fp, NULL, 0);
1840 ctf_dynset_destroy (fp->ctf_dedup_atoms_alloc);
1841
1842 for (err = ctf_list_next (&fp->ctf_errs_warnings); err != NULL; err = nerr)
1843 {
1844 nerr = ctf_list_next (err);
1845 ctf_list_delete (&fp->ctf_errs_warnings, err);
1846 free (err->cew_text);
1847 free (err);
1848 }
1849
1850 free (fp->ctf_sxlate);
1851 free (fp->ctf_txlate);
1852 free (fp->ctf_ptrtab);
1853 free (fp->ctf_pptrtab);
1854
1855 free (fp->ctf_header);
1856 free (fp);
1857 }
1858
1859 /* Backward compatibility. */
1860 void
1861 ctf_file_close (ctf_file_t *fp)
1862 {
1863 ctf_dict_close (fp);
1864 }
1865
1866 /* The converse of ctf_open(). ctf_open() disguises whatever it opens as an
1867 archive, so closing one is just like closing an archive. */
1868 void
1869 ctf_close (ctf_archive_t *arc)
1870 {
1871 ctf_arc_close (arc);
1872 }
1873
1874 /* Get the CTF archive from which this ctf_dict_t is derived. */
1875 ctf_archive_t *
1876 ctf_get_arc (const ctf_dict_t *fp)
1877 {
1878 return fp->ctf_archive;
1879 }
1880
1881 /* Return the ctfsect out of the core ctf_impl. Useful for freeing the
1882 ctfsect's data * after ctf_dict_close(), which is why we return the actual
1883 structure, not a pointer to it, since that is likely to become a pointer to
1884 freed data before the return value is used under the expected use case of
1885 ctf_getsect()/ ctf_dict_close()/free(). */
1886 ctf_sect_t
1887 ctf_getdatasect (const ctf_dict_t *fp)
1888 {
1889 return fp->ctf_data;
1890 }
1891
1892 ctf_sect_t
1893 ctf_getsymsect (const ctf_dict_t *fp)
1894 {
1895 return fp->ctf_ext_symtab;
1896 }
1897
1898 ctf_sect_t
1899 ctf_getstrsect (const ctf_dict_t *fp)
1900 {
1901 return fp->ctf_ext_strtab;
1902 }
1903
1904 /* Set the endianness of the symbol table attached to FP. */
1905 void
1906 ctf_symsect_endianness (ctf_dict_t *fp, int little_endian)
1907 {
1908 int old_endianness = fp->ctf_symsect_little_endian;
1909
1910 fp->ctf_symsect_little_endian = !!little_endian;
1911
1912 /* If we already have a symtab translation table, we need to repopulate it if
1913 our idea of the endianness has changed. */
1914
1915 if (old_endianness != fp->ctf_symsect_little_endian
1916 && fp->ctf_sxlate != NULL && fp->ctf_ext_symtab.cts_data != NULL)
1917 assert (init_symtab (fp, fp->ctf_header, &fp->ctf_ext_symtab) == 0);
1918 }
1919
1920 /* Return the CTF handle for the parent CTF dict, if one exists. Otherwise
1921 return NULL to indicate this dict has no imported parent. */
1922 ctf_dict_t *
1923 ctf_parent_dict (ctf_dict_t *fp)
1924 {
1925 return fp->ctf_parent;
1926 }
1927
1928 /* Backward compatibility. */
1929 ctf_dict_t *
1930 ctf_parent_file (ctf_dict_t *fp)
1931 {
1932 return ctf_parent_dict (fp);
1933 }
1934
1935 /* Return the name of the parent CTF dict, if one exists, or NULL otherwise. */
1936 const char *
1937 ctf_parent_name (ctf_dict_t *fp)
1938 {
1939 return fp->ctf_parname;
1940 }
1941
1942 /* Set the parent name. It is an error to call this routine without calling
1943 ctf_import() at some point. */
1944 int
1945 ctf_parent_name_set (ctf_dict_t *fp, const char *name)
1946 {
1947 if (fp->ctf_dynparname != NULL)
1948 free (fp->ctf_dynparname);
1949
1950 if ((fp->ctf_dynparname = strdup (name)) == NULL)
1951 return (ctf_set_errno (fp, ENOMEM));
1952 fp->ctf_parname = fp->ctf_dynparname;
1953 return 0;
1954 }
1955
1956 /* Return the name of the compilation unit this CTF file applies to. Usually
1957 non-NULL only for non-parent dicts. */
1958 const char *
1959 ctf_cuname (ctf_dict_t *fp)
1960 {
1961 return fp->ctf_cuname;
1962 }
1963
1964 /* Set the compilation unit name. */
1965 int
1966 ctf_cuname_set (ctf_dict_t *fp, const char *name)
1967 {
1968 if (fp->ctf_dyncuname != NULL)
1969 free (fp->ctf_dyncuname);
1970
1971 if ((fp->ctf_dyncuname = strdup (name)) == NULL)
1972 return (ctf_set_errno (fp, ENOMEM));
1973 fp->ctf_cuname = fp->ctf_dyncuname;
1974 return 0;
1975 }
1976
1977 /* Import the types from the specified parent dict by storing a pointer to it in
1978 ctf_parent and incrementing its reference count. Only one parent is allowed:
1979 if a parent already exists, it is replaced by the new parent. The pptrtab
1980 is wiped, and will be refreshed by the next ctf_lookup_by_name call. */
1981 int
1982 ctf_import (ctf_dict_t *fp, ctf_dict_t *pfp)
1983 {
1984 if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
1985 return (ctf_set_errno (fp, EINVAL));
1986
1987 if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
1988 return (ctf_set_errno (fp, ECTF_DMODEL));
1989
1990 if (fp->ctf_parent && !fp->ctf_parent_unreffed)
1991 ctf_dict_close (fp->ctf_parent);
1992 fp->ctf_parent = NULL;
1993
1994 free (fp->ctf_pptrtab);
1995 fp->ctf_pptrtab = NULL;
1996 fp->ctf_pptrtab_len = 0;
1997 fp->ctf_pptrtab_typemax = 0;
1998
1999 if (pfp != NULL)
2000 {
2001 int err;
2002
2003 if (fp->ctf_parname == NULL)
2004 if ((err = ctf_parent_name_set (fp, "PARENT")) < 0)
2005 return err;
2006
2007 fp->ctf_flags |= LCTF_CHILD;
2008 pfp->ctf_refcnt++;
2009 fp->ctf_parent_unreffed = 0;
2010 }
2011
2012 fp->ctf_parent = pfp;
2013 return 0;
2014 }
2015
2016 /* Like ctf_import, but does not increment the refcount on the imported parent
2017 or close it at any point: as a result it can go away at any time and the
2018 caller must do all freeing itself. Used internally to avoid refcount
2019 loops. */
2020 int
2021 ctf_import_unref (ctf_dict_t *fp, ctf_dict_t *pfp)
2022 {
2023 if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
2024 return (ctf_set_errno (fp, EINVAL));
2025
2026 if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
2027 return (ctf_set_errno (fp, ECTF_DMODEL));
2028
2029 if (fp->ctf_parent && !fp->ctf_parent_unreffed)
2030 ctf_dict_close (fp->ctf_parent);
2031 fp->ctf_parent = NULL;
2032
2033 free (fp->ctf_pptrtab);
2034 fp->ctf_pptrtab = NULL;
2035 fp->ctf_pptrtab_len = 0;
2036 fp->ctf_pptrtab_typemax = 0;
2037 if (pfp != NULL)
2038 {
2039 int err;
2040
2041 if (fp->ctf_parname == NULL)
2042 if ((err = ctf_parent_name_set (fp, "PARENT")) < 0)
2043 return err;
2044
2045 fp->ctf_flags |= LCTF_CHILD;
2046 fp->ctf_parent_unreffed = 1;
2047 }
2048
2049 fp->ctf_parent = pfp;
2050 return 0;
2051 }
2052
2053 /* Set the data model constant for the CTF dict. */
2054 int
2055 ctf_setmodel (ctf_dict_t *fp, int model)
2056 {
2057 const ctf_dmodel_t *dp;
2058
2059 for (dp = _libctf_models; dp->ctd_name != NULL; dp++)
2060 {
2061 if (dp->ctd_code == model)
2062 {
2063 fp->ctf_dmodel = dp;
2064 return 0;
2065 }
2066 }
2067
2068 return (ctf_set_errno (fp, EINVAL));
2069 }
2070
2071 /* Return the data model constant for the CTF dict. */
2072 int
2073 ctf_getmodel (ctf_dict_t *fp)
2074 {
2075 return fp->ctf_dmodel->ctd_code;
2076 }
2077
2078 /* The caller can hang an arbitrary pointer off each ctf_dict_t using this
2079 function. */
2080 void
2081 ctf_setspecific (ctf_dict_t *fp, void *data)
2082 {
2083 fp->ctf_specific = data;
2084 }
2085
2086 /* Retrieve the arbitrary pointer again. */
2087 void *
2088 ctf_getspecific (ctf_dict_t *fp)
2089 {
2090 return fp->ctf_specific;
2091 }
2092