4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
24 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
25 * Use is subject to license terms.
28 * Copyright (c) 2013, Joyent, Inc. All rights reserved.
35 static const ctf_dmodel_t _libctf_models
[] = {
36 { "ILP32", CTF_MODEL_ILP32
, 4, 1, 2, 4, 4 },
37 { "LP64", CTF_MODEL_LP64
, 8, 1, 2, 4, 8 },
38 { NULL
, 0, 0, 0, 0, 0, 0 }
41 const char _CTF_SECTION
[] = ".SUNW_ctf";
42 const char _CTF_NULLSTR
[] = "";
44 int _libctf_version
= CTF_VERSION
; /* library client version */
45 int _libctf_debug
= 0; /* debugging messages enabled */
48 get_kind_v1(ushort_t info
)
50 return (CTF_INFO_KIND_V1(info
));
54 get_kind_v2(ushort_t info
)
56 return (CTF_INFO_KIND(info
));
60 get_root_v1(ushort_t info
)
62 return (CTF_INFO_ISROOT_V1(info
));
66 get_root_v2(ushort_t info
)
68 return (CTF_INFO_ISROOT(info
));
72 get_vlen_v1(ushort_t info
)
74 return (CTF_INFO_VLEN_V1(info
));
78 get_vlen_v2(ushort_t info
)
80 return (CTF_INFO_VLEN(info
));
83 static const ctf_fileops_t ctf_fileops
[] = {
85 { get_kind_v1
, get_root_v1
, get_vlen_v1
},
86 { get_kind_v2
, get_root_v2
, get_vlen_v2
},
90 * Convert a 32-bit ELF symbol into GElf (Elf64) and return a pointer to it.
93 sym_to_gelf(const Elf32_Sym
*src
, Elf64_Sym
*dst
)
95 dst
->st_name
= src
->st_name
;
96 dst
->st_value
= src
->st_value
;
97 dst
->st_size
= src
->st_size
;
98 dst
->st_info
= src
->st_info
;
99 dst
->st_other
= src
->st_other
;
100 dst
->st_shndx
= src
->st_shndx
;
106 * Initialize the symtab translation table by filling each entry with the
107 * offset of the CTF type or function data corresponding to each STT_FUNC or
108 * STT_OBJECT entry in the symbol table.
111 init_symtab(ctf_file_t
*fp
, const ctf_header_t
*hp
,
112 const ctf_sect_t
*sp
, const ctf_sect_t
*strp
)
114 const uchar_t
*symp
= sp
->cts_data
;
115 uint_t
*xp
= fp
->ctf_sxlate
;
116 uint_t
*xend
= xp
+ fp
->ctf_nsyms
;
118 uint_t objtoff
= hp
->cth_objtoff
;
119 uint_t funcoff
= hp
->cth_funcoff
;
126 * The CTF data object and function type sections are ordered to match
127 * the relative order of the respective symbol types in the symtab.
128 * If no type information is available for a symbol table entry, a
129 * pad is inserted in the CTF section. As a further optimization,
130 * anonymous or undefined symbols are omitted from the CTF data.
132 for (; xp
< xend
; xp
++, symp
+= sp
->cts_entsize
) {
133 if (sp
->cts_entsize
== sizeof (Elf32_Sym
))
134 gsp
= sym_to_gelf((Elf32_Sym
*)(uintptr_t)symp
, &sym
);
136 gsp
= (Elf64_Sym
*)(uintptr_t)symp
;
138 if (gsp
->st_name
< strp
->cts_size
)
139 name
= (const char *)strp
->cts_data
+ gsp
->st_name
;
143 if (gsp
->st_name
== 0 || gsp
->st_shndx
== SHN_UNDEF
||
144 strcmp(name
, "_START_") == 0 ||
145 strcmp(name
, "_END_") == 0) {
150 switch (ELF64_ST_TYPE(gsp
->st_info
)) {
152 if (objtoff
>= hp
->cth_funcoff
||
153 (gsp
->st_shndx
== SHN_ABS
&& gsp
->st_value
== 0)) {
159 objtoff
+= sizeof (ushort_t
);
163 if (funcoff
>= hp
->cth_typeoff
) {
170 info
= *(ushort_t
*)((uintptr_t)fp
->ctf_buf
+ funcoff
);
171 vlen
= LCTF_INFO_VLEN(fp
, info
);
174 * If we encounter a zero pad at the end, just skip it.
175 * Otherwise skip over the function and its return type
176 * (+2) and the argument list (vlen).
178 if (LCTF_INFO_KIND(fp
, info
) == CTF_K_UNKNOWN
&&
180 funcoff
+= sizeof (ushort_t
); /* skip pad */
182 funcoff
+= sizeof (ushort_t
) * (vlen
+ 2);
191 ctf_dprintf("loaded %lu symtab entries\n", fp
->ctf_nsyms
);
196 * Initialize the type ID translation table with the byte offset of each type,
197 * and initialize the hash tables of each named type.
200 init_types(ctf_file_t
*fp
, const ctf_header_t
*cth
)
202 /* LINTED - pointer alignment */
203 const ctf_type_t
*tbuf
= (ctf_type_t
*)(fp
->ctf_buf
+ cth
->cth_typeoff
);
204 /* LINTED - pointer alignment */
205 const ctf_type_t
*tend
= (ctf_type_t
*)(fp
->ctf_buf
+ cth
->cth_stroff
);
207 ulong_t pop
[CTF_K_MAX
+ 1] = { 0 };
208 const ctf_type_t
*tp
;
214 * We initially determine whether the container is a child or a parent
215 * based on the value of cth_parname. To support containers that pre-
216 * date cth_parname, we also scan the types themselves for references
217 * to values in the range reserved for child types in our first pass.
219 int child
= cth
->cth_parname
!= 0;
220 int nlstructs
= 0, nlunions
= 0;
224 * We make two passes through the entire type section. In this first
225 * pass, we count the number of each type and the total number of types.
227 for (tp
= tbuf
; tp
< tend
; fp
->ctf_typemax
++) {
228 ushort_t kind
= LCTF_INFO_KIND(fp
, tp
->ctt_info
);
229 ulong_t vlen
= LCTF_INFO_VLEN(fp
, tp
->ctt_info
);
230 ssize_t size
, increment
;
235 (void) ctf_get_ctt_size(fp
, tp
, &size
, &increment
);
240 vbytes
= sizeof (uint_t
);
243 vbytes
= sizeof (ctf_array_t
);
246 vbytes
= sizeof (ushort_t
) * (vlen
+ (vlen
& 1));
250 if (fp
->ctf_version
== CTF_VERSION_1
||
251 size
< CTF_LSTRUCT_THRESH
) {
252 ctf_member_t
*mp
= (ctf_member_t
*)
253 ((uintptr_t)tp
+ increment
);
255 vbytes
= sizeof (ctf_member_t
) * vlen
;
256 for (n
= vlen
; n
!= 0; n
--, mp
++)
257 child
|= CTF_TYPE_ISCHILD(mp
->ctm_type
);
259 ctf_lmember_t
*lmp
= (ctf_lmember_t
*)
260 ((uintptr_t)tp
+ increment
);
262 vbytes
= sizeof (ctf_lmember_t
) * vlen
;
263 for (n
= vlen
; n
!= 0; n
--, lmp
++)
265 CTF_TYPE_ISCHILD(lmp
->ctlm_type
);
269 vbytes
= sizeof (ctf_enum_t
) * vlen
;
273 * For forward declarations, ctt_type is the CTF_K_*
274 * kind for the tag, so bump that population count too.
275 * If ctt_type is unknown, treat the tag as a struct.
277 if (tp
->ctt_type
== CTF_K_UNKNOWN
||
278 tp
->ctt_type
>= CTF_K_MAX
)
291 child
|= CTF_TYPE_ISCHILD(tp
->ctt_type
);
295 ctf_dprintf("detected invalid CTF kind -- %u\n", kind
);
296 return (ECTF_CORRUPT
);
298 tp
= (ctf_type_t
*)((uintptr_t)tp
+ increment
+ vbytes
);
303 * If we detected a reference to a child type ID, then we know this
304 * container is a child and may have a parent's types imported later.
307 ctf_dprintf("CTF container %p is a child\n", (void *)fp
);
308 fp
->ctf_flags
|= LCTF_CHILD
;
310 ctf_dprintf("CTF container %p is a parent\n", (void *)fp
);
313 * Now that we've counted up the number of each type, we can allocate
314 * the hash tables, type translation table, and pointer table.
316 if ((err
= ctf_hash_create(&fp
->ctf_structs
, pop
[CTF_K_STRUCT
])) != 0)
319 if ((err
= ctf_hash_create(&fp
->ctf_unions
, pop
[CTF_K_UNION
])) != 0)
322 if ((err
= ctf_hash_create(&fp
->ctf_enums
, pop
[CTF_K_ENUM
])) != 0)
325 if ((err
= ctf_hash_create(&fp
->ctf_names
,
326 pop
[CTF_K_INTEGER
] + pop
[CTF_K_FLOAT
] + pop
[CTF_K_FUNCTION
] +
327 pop
[CTF_K_TYPEDEF
] + pop
[CTF_K_POINTER
] + pop
[CTF_K_VOLATILE
] +
328 pop
[CTF_K_CONST
] + pop
[CTF_K_RESTRICT
])) != 0)
331 fp
->ctf_txlate
= ctf_alloc(sizeof (uint_t
) * (fp
->ctf_typemax
+ 1));
332 fp
->ctf_ptrtab
= ctf_alloc(sizeof (ushort_t
) * (fp
->ctf_typemax
+ 1));
334 if (fp
->ctf_txlate
== NULL
|| fp
->ctf_ptrtab
== NULL
)
335 return (EAGAIN
); /* memory allocation failed */
338 *xp
++ = 0; /* type id 0 is used as a sentinel value */
340 bzero(fp
->ctf_txlate
, sizeof (uint_t
) * (fp
->ctf_typemax
+ 1));
341 bzero(fp
->ctf_ptrtab
, sizeof (ushort_t
) * (fp
->ctf_typemax
+ 1));
344 * In the second pass through the types, we fill in each entry of the
345 * type and pointer tables and add names to the appropriate hashes.
347 for (id
= 1, tp
= tbuf
; tp
< tend
; xp
++, id
++) {
348 ushort_t kind
= LCTF_INFO_KIND(fp
, tp
->ctt_info
);
349 ulong_t vlen
= LCTF_INFO_VLEN(fp
, tp
->ctt_info
);
350 ssize_t size
, increment
;
357 (void) ctf_get_ctt_size(fp
, tp
, &size
, &increment
);
358 name
= ctf_strptr(fp
, tp
->ctt_name
);
364 * Only insert a new integer base type definition if
365 * this type name has not been defined yet. We re-use
366 * the names with different encodings for bit-fields.
368 if ((hep
= ctf_hash_lookup(&fp
->ctf_names
, fp
,
369 name
, strlen(name
))) == NULL
) {
370 err
= ctf_hash_insert(&fp
->ctf_names
, fp
,
371 CTF_INDEX_TO_TYPE(id
, child
), tp
->ctt_name
);
372 if (err
!= 0 && err
!= ECTF_STRTAB
)
374 } else if (ctf_type_encoding(fp
, hep
->h_type
,
375 &cte
) == 0 && cte
.cte_bits
== 0) {
377 * Work-around SOS8 stabs bug: replace existing
378 * intrinsic w/ same name if it was zero bits.
380 hep
->h_type
= CTF_INDEX_TO_TYPE(id
, child
);
382 vbytes
= sizeof (uint_t
);
386 vbytes
= sizeof (ctf_array_t
);
390 err
= ctf_hash_insert(&fp
->ctf_names
, fp
,
391 CTF_INDEX_TO_TYPE(id
, child
), tp
->ctt_name
);
392 if (err
!= 0 && err
!= ECTF_STRTAB
)
394 vbytes
= sizeof (ushort_t
) * (vlen
+ (vlen
& 1));
398 err
= ctf_hash_define(&fp
->ctf_structs
, fp
,
399 CTF_INDEX_TO_TYPE(id
, child
), tp
->ctt_name
);
401 if (err
!= 0 && err
!= ECTF_STRTAB
)
404 if (fp
->ctf_version
== CTF_VERSION_1
||
405 size
< CTF_LSTRUCT_THRESH
)
406 vbytes
= sizeof (ctf_member_t
) * vlen
;
408 vbytes
= sizeof (ctf_lmember_t
) * vlen
;
414 err
= ctf_hash_define(&fp
->ctf_unions
, fp
,
415 CTF_INDEX_TO_TYPE(id
, child
), tp
->ctt_name
);
417 if (err
!= 0 && err
!= ECTF_STRTAB
)
420 if (fp
->ctf_version
== CTF_VERSION_1
||
421 size
< CTF_LSTRUCT_THRESH
)
422 vbytes
= sizeof (ctf_member_t
) * vlen
;
424 vbytes
= sizeof (ctf_lmember_t
) * vlen
;
430 err
= ctf_hash_define(&fp
->ctf_enums
, fp
,
431 CTF_INDEX_TO_TYPE(id
, child
), tp
->ctt_name
);
433 if (err
!= 0 && err
!= ECTF_STRTAB
)
436 vbytes
= sizeof (ctf_enum_t
) * vlen
;
440 err
= ctf_hash_insert(&fp
->ctf_names
, fp
,
441 CTF_INDEX_TO_TYPE(id
, child
), tp
->ctt_name
);
442 if (err
!= 0 && err
!= ECTF_STRTAB
)
449 * Only insert forward tags into the given hash if the
450 * type or tag name is not already present.
452 switch (tp
->ctt_type
) {
454 hp
= &fp
->ctf_structs
;
457 hp
= &fp
->ctf_unions
;
463 hp
= &fp
->ctf_structs
;
466 if (ctf_hash_lookup(hp
, fp
,
467 name
, strlen(name
)) == NULL
) {
468 err
= ctf_hash_insert(hp
, fp
,
469 CTF_INDEX_TO_TYPE(id
, child
), tp
->ctt_name
);
470 if (err
!= 0 && err
!= ECTF_STRTAB
)
478 * If the type referenced by the pointer is in this CTF
479 * container, then store the index of the pointer type
480 * in fp->ctf_ptrtab[ index of referenced type ].
482 if (CTF_TYPE_ISCHILD(tp
->ctt_type
) == child
&&
483 CTF_TYPE_TO_INDEX(tp
->ctt_type
) <= fp
->ctf_typemax
)
485 CTF_TYPE_TO_INDEX(tp
->ctt_type
)] = id
;
491 err
= ctf_hash_insert(&fp
->ctf_names
, fp
,
492 CTF_INDEX_TO_TYPE(id
, child
), tp
->ctt_name
);
493 if (err
!= 0 && err
!= ECTF_STRTAB
)
502 *xp
= (uint_t
)((uintptr_t)tp
- (uintptr_t)fp
->ctf_buf
);
503 tp
= (ctf_type_t
*)((uintptr_t)tp
+ increment
+ vbytes
);
506 ctf_dprintf("%lu total types processed\n", fp
->ctf_typemax
);
507 ctf_dprintf("%u enum names hashed\n", ctf_hash_size(&fp
->ctf_enums
));
508 ctf_dprintf("%u struct names hashed (%d long)\n",
509 ctf_hash_size(&fp
->ctf_structs
), nlstructs
);
510 ctf_dprintf("%u union names hashed (%d long)\n",
511 ctf_hash_size(&fp
->ctf_unions
), nlunions
);
512 ctf_dprintf("%u base type names hashed\n",
513 ctf_hash_size(&fp
->ctf_names
));
516 * Make an additional pass through the pointer table to find pointers
517 * that point to anonymous typedef nodes. If we find one, modify the
518 * pointer table so that the pointer is also known to point to the
519 * node that is referenced by the anonymous typedef node.
521 for (id
= 1; id
<= fp
->ctf_typemax
; id
++) {
522 if ((dst
= fp
->ctf_ptrtab
[id
]) != 0) {
523 tp
= LCTF_INDEX_TO_TYPEPTR(fp
, id
);
525 if (LCTF_INFO_KIND(fp
, tp
->ctt_info
) == CTF_K_TYPEDEF
&&
526 strcmp(ctf_strptr(fp
, tp
->ctt_name
), "") == 0 &&
527 CTF_TYPE_ISCHILD(tp
->ctt_type
) == child
&&
528 CTF_TYPE_TO_INDEX(tp
->ctt_type
) <= fp
->ctf_typemax
)
530 CTF_TYPE_TO_INDEX(tp
->ctt_type
)] = dst
;
538 * Decode the specified CTF buffer and optional symbol table and create a new
539 * CTF container representing the symbolic debugging information. This code
540 * can be used directly by the debugger, or it can be used as the engine for
541 * ctf_fdopen() or ctf_open(), below.
544 ctf_bufopen(const ctf_sect_t
*ctfsect
, const ctf_sect_t
*symsect
,
545 const ctf_sect_t
*strsect
, int *errp
)
547 const ctf_preamble_t
*pp
;
554 if (ctfsect
== NULL
|| ((symsect
== NULL
) != (strsect
== NULL
)))
555 return (ctf_set_open_errno(errp
, EINVAL
));
557 if (symsect
!= NULL
&& symsect
->cts_entsize
!= sizeof (Elf32_Sym
) &&
558 symsect
->cts_entsize
!= sizeof (Elf64_Sym
))
559 return (ctf_set_open_errno(errp
, ECTF_SYMTAB
));
561 if (symsect
!= NULL
&& symsect
->cts_data
== NULL
)
562 return (ctf_set_open_errno(errp
, ECTF_SYMBAD
));
564 if (strsect
!= NULL
&& strsect
->cts_data
== NULL
)
565 return (ctf_set_open_errno(errp
, ECTF_STRBAD
));
567 if (ctfsect
->cts_size
< sizeof (ctf_preamble_t
))
568 return (ctf_set_open_errno(errp
, ECTF_NOCTFBUF
));
570 pp
= (const ctf_preamble_t
*)ctfsect
->cts_data
;
572 ctf_dprintf("ctf_bufopen: magic=0x%x version=%u\n",
573 pp
->ctp_magic
, pp
->ctp_version
);
576 * Validate each part of the CTF header (either V1 or V2).
577 * First, we validate the preamble (common to all versions). At that
578 * point, we know specific header version, and can validate the
579 * version-specific parts including section offsets and alignments.
581 if (pp
->ctp_magic
!= CTF_MAGIC
)
582 return (ctf_set_open_errno(errp
, ECTF_NOCTFBUF
));
584 if (pp
->ctp_version
== CTF_VERSION_2
) {
585 if (ctfsect
->cts_size
< sizeof (ctf_header_t
))
586 return (ctf_set_open_errno(errp
, ECTF_NOCTFBUF
));
588 bcopy(ctfsect
->cts_data
, &hp
, sizeof (hp
));
589 hdrsz
= sizeof (ctf_header_t
);
591 } else if (pp
->ctp_version
== CTF_VERSION_1
) {
592 const ctf_header_v1_t
*h1p
=
593 (const ctf_header_v1_t
*)ctfsect
->cts_data
;
595 if (ctfsect
->cts_size
< sizeof (ctf_header_v1_t
))
596 return (ctf_set_open_errno(errp
, ECTF_NOCTFBUF
));
598 bzero(&hp
, sizeof (hp
));
599 hp
.cth_preamble
= h1p
->cth_preamble
;
600 hp
.cth_objtoff
= h1p
->cth_objtoff
;
601 hp
.cth_funcoff
= h1p
->cth_funcoff
;
602 hp
.cth_typeoff
= h1p
->cth_typeoff
;
603 hp
.cth_stroff
= h1p
->cth_stroff
;
604 hp
.cth_strlen
= h1p
->cth_strlen
;
606 hdrsz
= sizeof (ctf_header_v1_t
);
608 return (ctf_set_open_errno(errp
, ECTF_CTFVERS
));
610 size
= hp
.cth_stroff
+ hp
.cth_strlen
;
612 ctf_dprintf("ctf_bufopen: uncompressed size=%lu\n", (ulong_t
)size
);
614 if (hp
.cth_lbloff
> size
|| hp
.cth_objtoff
> size
||
615 hp
.cth_funcoff
> size
|| hp
.cth_typeoff
> size
||
616 hp
.cth_stroff
> size
)
617 return (ctf_set_open_errno(errp
, ECTF_CORRUPT
));
619 if (hp
.cth_lbloff
> hp
.cth_objtoff
||
620 hp
.cth_objtoff
> hp
.cth_funcoff
||
621 hp
.cth_funcoff
> hp
.cth_typeoff
||
622 hp
.cth_typeoff
> hp
.cth_stroff
)
623 return (ctf_set_open_errno(errp
, ECTF_CORRUPT
));
625 if ((hp
.cth_lbloff
& 3) || (hp
.cth_objtoff
& 1) ||
626 (hp
.cth_funcoff
& 1) || (hp
.cth_typeoff
& 3))
627 return (ctf_set_open_errno(errp
, ECTF_CORRUPT
));
630 * Once everything is determined to be valid, attempt to decompress
631 * the CTF data buffer if it is compressed. Otherwise we just put
632 * the data section's buffer pointer into ctf_buf, below.
634 if (hp
.cth_flags
& CTF_F_COMPRESS
) {
635 size_t srclen
, dstlen
;
639 if (ctf_zopen(errp
) == NULL
)
640 return (NULL
); /* errp is set for us */
642 if ((base
= ctf_data_alloc(size
+ hdrsz
)) == MAP_FAILED
)
643 return (ctf_set_open_errno(errp
, ECTF_ZALLOC
));
645 bcopy(ctfsect
->cts_data
, base
, hdrsz
);
646 ((ctf_preamble_t
*)base
)->ctp_flags
&= ~CTF_F_COMPRESS
;
647 buf
= (uchar_t
*)base
+ hdrsz
;
649 src
= (uchar_t
*)ctfsect
->cts_data
+ hdrsz
;
650 srclen
= ctfsect
->cts_size
- hdrsz
;
653 if ((rc
= z_uncompress(buf
, &dstlen
, src
, srclen
)) != Z_OK
) {
654 ctf_dprintf("zlib inflate err: %s\n", z_strerror(rc
));
655 ctf_data_free(base
, size
+ hdrsz
);
656 return (ctf_set_open_errno(errp
, ECTF_DECOMPRESS
));
659 if (dstlen
!= size
) {
660 ctf_dprintf("zlib inflate short -- got %lu of %lu "
661 "bytes\n", (ulong_t
)dstlen
, (ulong_t
)size
);
662 ctf_data_free(base
, size
+ hdrsz
);
663 return (ctf_set_open_errno(errp
, ECTF_CORRUPT
));
666 ctf_data_protect(base
, size
+ hdrsz
);
669 base
= (void *)ctfsect
->cts_data
;
670 buf
= (uchar_t
*)base
+ hdrsz
;
674 * Once we have uncompressed and validated the CTF data buffer, we can
675 * proceed with allocating a ctf_file_t and initializing it.
677 if ((fp
= ctf_alloc(sizeof (ctf_file_t
))) == NULL
)
678 return (ctf_set_open_errno(errp
, EAGAIN
));
680 bzero(fp
, sizeof (ctf_file_t
));
681 fp
->ctf_version
= hp
.cth_version
;
682 fp
->ctf_fileops
= &ctf_fileops
[hp
.cth_version
];
683 bcopy(ctfsect
, &fp
->ctf_data
, sizeof (ctf_sect_t
));
685 if (symsect
!= NULL
) {
686 bcopy(symsect
, &fp
->ctf_symtab
, sizeof (ctf_sect_t
));
687 bcopy(strsect
, &fp
->ctf_strtab
, sizeof (ctf_sect_t
));
690 if (fp
->ctf_data
.cts_name
!= NULL
)
691 fp
->ctf_data
.cts_name
= ctf_strdup(fp
->ctf_data
.cts_name
);
692 if (fp
->ctf_symtab
.cts_name
!= NULL
)
693 fp
->ctf_symtab
.cts_name
= ctf_strdup(fp
->ctf_symtab
.cts_name
);
694 if (fp
->ctf_strtab
.cts_name
!= NULL
)
695 fp
->ctf_strtab
.cts_name
= ctf_strdup(fp
->ctf_strtab
.cts_name
);
697 if (fp
->ctf_data
.cts_name
== NULL
)
698 fp
->ctf_data
.cts_name
= _CTF_NULLSTR
;
699 if (fp
->ctf_symtab
.cts_name
== NULL
)
700 fp
->ctf_symtab
.cts_name
= _CTF_NULLSTR
;
701 if (fp
->ctf_strtab
.cts_name
== NULL
)
702 fp
->ctf_strtab
.cts_name
= _CTF_NULLSTR
;
704 fp
->ctf_str
[CTF_STRTAB_0
].cts_strs
= (const char *)buf
+ hp
.cth_stroff
;
705 fp
->ctf_str
[CTF_STRTAB_0
].cts_len
= hp
.cth_strlen
;
707 if (strsect
!= NULL
) {
708 fp
->ctf_str
[CTF_STRTAB_1
].cts_strs
= strsect
->cts_data
;
709 fp
->ctf_str
[CTF_STRTAB_1
].cts_len
= strsect
->cts_size
;
714 fp
->ctf_size
= size
+ hdrsz
;
717 * If we have a parent container name and label, store the relocated
718 * string pointers in the CTF container for easy access later.
720 if (hp
.cth_parlabel
!= 0)
721 fp
->ctf_parlabel
= ctf_strptr(fp
, hp
.cth_parlabel
);
722 if (hp
.cth_parname
!= 0)
723 fp
->ctf_parname
= ctf_strptr(fp
, hp
.cth_parname
);
725 ctf_dprintf("ctf_bufopen: parent name %s (label %s)\n",
726 fp
->ctf_parname
? fp
->ctf_parname
: "<NULL>",
727 fp
->ctf_parlabel
? fp
->ctf_parlabel
: "<NULL>");
730 * If we have a symbol table section, allocate and initialize
731 * the symtab translation table, pointed to by ctf_sxlate.
733 if (symsect
!= NULL
) {
734 fp
->ctf_nsyms
= symsect
->cts_size
/ symsect
->cts_entsize
;
735 fp
->ctf_sxlate
= ctf_alloc(fp
->ctf_nsyms
* sizeof (uint_t
));
737 if (fp
->ctf_sxlate
== NULL
) {
738 (void) ctf_set_open_errno(errp
, EAGAIN
);
742 if ((err
= init_symtab(fp
, &hp
, symsect
, strsect
)) != 0) {
743 (void) ctf_set_open_errno(errp
, err
);
748 if ((err
= init_types(fp
, &hp
)) != 0) {
749 (void) ctf_set_open_errno(errp
, err
);
754 * Initialize the ctf_lookup_by_name top-level dictionary. We keep an
755 * array of type name prefixes and the corresponding ctf_hash to use.
756 * NOTE: This code must be kept in sync with the code in ctf_update().
758 fp
->ctf_lookups
[0].ctl_prefix
= "struct";
759 fp
->ctf_lookups
[0].ctl_len
= strlen(fp
->ctf_lookups
[0].ctl_prefix
);
760 fp
->ctf_lookups
[0].ctl_hash
= &fp
->ctf_structs
;
761 fp
->ctf_lookups
[1].ctl_prefix
= "union";
762 fp
->ctf_lookups
[1].ctl_len
= strlen(fp
->ctf_lookups
[1].ctl_prefix
);
763 fp
->ctf_lookups
[1].ctl_hash
= &fp
->ctf_unions
;
764 fp
->ctf_lookups
[2].ctl_prefix
= "enum";
765 fp
->ctf_lookups
[2].ctl_len
= strlen(fp
->ctf_lookups
[2].ctl_prefix
);
766 fp
->ctf_lookups
[2].ctl_hash
= &fp
->ctf_enums
;
767 fp
->ctf_lookups
[3].ctl_prefix
= _CTF_NULLSTR
;
768 fp
->ctf_lookups
[3].ctl_len
= strlen(fp
->ctf_lookups
[3].ctl_prefix
);
769 fp
->ctf_lookups
[3].ctl_hash
= &fp
->ctf_names
;
770 fp
->ctf_lookups
[4].ctl_prefix
= NULL
;
771 fp
->ctf_lookups
[4].ctl_len
= 0;
772 fp
->ctf_lookups
[4].ctl_hash
= NULL
;
774 if (symsect
!= NULL
) {
775 if (symsect
->cts_entsize
== sizeof (Elf64_Sym
))
776 (void) ctf_setmodel(fp
, CTF_MODEL_LP64
);
778 (void) ctf_setmodel(fp
, CTF_MODEL_ILP32
);
780 (void) ctf_setmodel(fp
, CTF_MODEL_NATIVE
);
791 * Dupliate a ctf_file_t and its underlying section information into a new
792 * container. This works by copying the three ctf_sect_t's of the original
793 * container if they exist and passing those into ctf_bufopen. To copy those, we
794 * mmap anonymous memory with ctf_data_alloc and bcopy the data across. It's not
795 * the cheapest thing, but it's what we've got.
798 ctf_dup(ctf_file_t
*ofp
)
801 ctf_sect_t ctfsect
, symsect
, strsect
;
802 ctf_sect_t
*ctp
, *symp
, *strp
;
803 void *cbuf
, *symbuf
, *strbuf
;
806 cbuf
= symbuf
= strbuf
= NULL
;
808 * The ctfsect isn't allowed to not exist, but the symbol and string
809 * section might not. We only need to copy the data of the section, not
810 * the name, as ctf_bufopen will take care of that.
812 bcopy(&ofp
->ctf_data
, &ctfsect
, sizeof (ctf_sect_t
));
813 cbuf
= ctf_data_alloc(ctfsect
.cts_size
);
815 (void) ctf_set_errno(ofp
, ECTF_MMAP
);
819 bcopy(ctfsect
.cts_data
, cbuf
, ctfsect
.cts_size
);
820 ctf_data_protect(cbuf
, ctfsect
.cts_size
);
821 ctfsect
.cts_data
= cbuf
;
822 ctfsect
.cts_offset
= 0;
825 if (ofp
->ctf_symtab
.cts_data
!= NULL
) {
826 bcopy(&ofp
->ctf_symtab
, &symsect
, sizeof (ctf_sect_t
));
827 symbuf
= ctf_data_alloc(symsect
.cts_size
);
828 if (symbuf
== NULL
) {
829 (void) ctf_set_errno(ofp
, ECTF_MMAP
);
832 bcopy(symsect
.cts_data
, symbuf
, symsect
.cts_size
);
833 ctf_data_protect(symbuf
, symsect
.cts_size
);
834 symsect
.cts_data
= symbuf
;
835 symsect
.cts_offset
= 0;
841 if (ofp
->ctf_strtab
.cts_data
!= NULL
) {
842 bcopy(&ofp
->ctf_strtab
, &strsect
, sizeof (ctf_sect_t
));
843 strbuf
= ctf_data_alloc(strsect
.cts_size
);
844 if (strbuf
== NULL
) {
845 (void) ctf_set_errno(ofp
, ECTF_MMAP
);
848 bcopy(strsect
.cts_data
, strbuf
, strsect
.cts_size
);
849 ctf_data_protect(strbuf
, strsect
.cts_size
);
850 strsect
.cts_data
= strbuf
;
851 strsect
.cts_offset
= 0;
857 fp
= ctf_bufopen(ctp
, symp
, strp
, &err
);
859 (void) ctf_set_errno(ofp
, err
);
863 fp
->ctf_flags
|= LCTF_MMAP
;
868 ctf_data_free(cbuf
, ctfsect
.cts_size
);
870 ctf_data_free(symbuf
, symsect
.cts_size
);
872 ctf_data_free(strbuf
, strsect
.cts_size
);
877 * Close the specified CTF container and free associated data structures. Note
878 * that ctf_close() is a reference counted operation: if the specified file is
879 * the parent of other active containers, its reference count will be greater
880 * than one and it will be freed later when no active children exist.
883 ctf_close(ctf_file_t
*fp
)
885 ctf_dtdef_t
*dtd
, *ntd
;
888 return; /* allow ctf_close(NULL) to simplify caller code */
890 ctf_dprintf("ctf_close(%p) refcnt=%u\n", (void *)fp
, fp
->ctf_refcnt
);
892 if (fp
->ctf_refcnt
> 1) {
897 if (fp
->ctf_parent
!= NULL
)
898 ctf_close(fp
->ctf_parent
);
901 * Note, to work properly with reference counting on the dynamic
902 * section, we must delete the list in reverse.
904 for (dtd
= ctf_list_prev(&fp
->ctf_dtdefs
); dtd
!= NULL
; dtd
= ntd
) {
905 ntd
= ctf_list_prev(dtd
);
906 ctf_dtd_delete(fp
, dtd
);
909 ctf_free(fp
->ctf_dthash
, fp
->ctf_dthashlen
* sizeof (ctf_dtdef_t
*));
911 if (fp
->ctf_flags
& LCTF_MMAP
) {
912 if (fp
->ctf_data
.cts_data
!= NULL
)
913 ctf_sect_munmap(&fp
->ctf_data
);
914 if (fp
->ctf_symtab
.cts_data
!= NULL
)
915 ctf_sect_munmap(&fp
->ctf_symtab
);
916 if (fp
->ctf_strtab
.cts_data
!= NULL
)
917 ctf_sect_munmap(&fp
->ctf_strtab
);
920 if (fp
->ctf_data
.cts_name
!= _CTF_NULLSTR
&&
921 fp
->ctf_data
.cts_name
!= NULL
) {
922 ctf_free((char *)fp
->ctf_data
.cts_name
,
923 strlen(fp
->ctf_data
.cts_name
) + 1);
926 if (fp
->ctf_symtab
.cts_name
!= _CTF_NULLSTR
&&
927 fp
->ctf_symtab
.cts_name
!= NULL
) {
928 ctf_free((char *)fp
->ctf_symtab
.cts_name
,
929 strlen(fp
->ctf_symtab
.cts_name
) + 1);
932 if (fp
->ctf_strtab
.cts_name
!= _CTF_NULLSTR
&&
933 fp
->ctf_strtab
.cts_name
!= NULL
) {
934 ctf_free((char *)fp
->ctf_strtab
.cts_name
,
935 strlen(fp
->ctf_strtab
.cts_name
) + 1);
938 if (fp
->ctf_base
!= fp
->ctf_data
.cts_data
&& fp
->ctf_base
!= NULL
)
939 ctf_data_free((void *)fp
->ctf_base
, fp
->ctf_size
);
941 if (fp
->ctf_sxlate
!= NULL
)
942 ctf_free(fp
->ctf_sxlate
, sizeof (uint_t
) * fp
->ctf_nsyms
);
944 if (fp
->ctf_txlate
!= NULL
) {
945 ctf_free(fp
->ctf_txlate
,
946 sizeof (uint_t
) * (fp
->ctf_typemax
+ 1));
949 if (fp
->ctf_ptrtab
!= NULL
) {
950 ctf_free(fp
->ctf_ptrtab
,
951 sizeof (ushort_t
) * (fp
->ctf_typemax
+ 1));
954 ctf_hash_destroy(&fp
->ctf_structs
);
955 ctf_hash_destroy(&fp
->ctf_unions
);
956 ctf_hash_destroy(&fp
->ctf_enums
);
957 ctf_hash_destroy(&fp
->ctf_names
);
959 ctf_free(fp
, sizeof (ctf_file_t
));
963 * Return the CTF handle for the parent CTF container, if one exists.
964 * Otherwise return NULL to indicate this container has no imported parent.
967 ctf_parent_file(ctf_file_t
*fp
)
969 return (fp
->ctf_parent
);
973 * Return the name of the parent CTF container, if one exists. Otherwise
974 * return NULL to indicate this container is a root container.
977 ctf_parent_name(ctf_file_t
*fp
)
979 return (fp
->ctf_parname
);
983 * Import the types from the specified parent container by storing a pointer
984 * to it in ctf_parent and incrementing its reference count. Only one parent
985 * is allowed: if a parent already exists, it is replaced by the new parent.
988 ctf_import(ctf_file_t
*fp
, ctf_file_t
*pfp
)
990 if (fp
== NULL
|| fp
== pfp
|| (pfp
!= NULL
&& pfp
->ctf_refcnt
== 0))
991 return (ctf_set_errno(fp
, EINVAL
));
993 if (pfp
!= NULL
&& pfp
->ctf_dmodel
!= fp
->ctf_dmodel
)
994 return (ctf_set_errno(fp
, ECTF_DMODEL
));
996 if (fp
->ctf_parent
!= NULL
)
997 ctf_close(fp
->ctf_parent
);
1000 fp
->ctf_flags
|= LCTF_CHILD
;
1004 fp
->ctf_parent
= pfp
;
1009 * Set the data model constant for the CTF container.
1012 ctf_setmodel(ctf_file_t
*fp
, int model
)
1014 const ctf_dmodel_t
*dp
;
1016 for (dp
= _libctf_models
; dp
->ctd_name
!= NULL
; dp
++) {
1017 if (dp
->ctd_code
== model
) {
1018 fp
->ctf_dmodel
= dp
;
1023 return (ctf_set_errno(fp
, EINVAL
));
1027 * Return the data model constant for the CTF container.
1030 ctf_getmodel(ctf_file_t
*fp
)
1032 return (fp
->ctf_dmodel
->ctd_code
);
1036 ctf_setspecific(ctf_file_t
*fp
, void *data
)
1038 fp
->ctf_specific
= data
;
1042 ctf_getspecific(ctf_file_t
*fp
)
1044 return (fp
->ctf_specific
);