xref: /titanic_50/usr/src/man/man4/ctf.4 (revision 3a005aada8ac0e291c13cbc488ba9ae1473f0a96)
1fe2e029eSRobert Mustacchi.\"
2fe2e029eSRobert Mustacchi.\" This file and its contents are supplied under the terms of the
3fe2e029eSRobert Mustacchi.\" Common Development and Distribution License ("CDDL"), version 1.0.
4fe2e029eSRobert Mustacchi.\" You may only use this file in accordance with the terms of version
5fe2e029eSRobert Mustacchi.\" 1.0 of the CDDL.
6fe2e029eSRobert Mustacchi.\"
7fe2e029eSRobert Mustacchi.\" A full copy of the text of the CDDL should have accompanied this
8fe2e029eSRobert Mustacchi.\" source.  A copy of the CDDL is also available via the Internet at
9fe2e029eSRobert Mustacchi.\" http://www.illumos.org/license/CDDL.
10fe2e029eSRobert Mustacchi.\"
11fe2e029eSRobert Mustacchi.\"
12fe2e029eSRobert Mustacchi.\" Copyright (c) 2014 Joyent, Inc.
13fe2e029eSRobert Mustacchi.\"
14fe2e029eSRobert Mustacchi.Dd Sep 26, 2014
15fe2e029eSRobert Mustacchi.Dt CTF 4
16fe2e029eSRobert Mustacchi.Os
17fe2e029eSRobert Mustacchi.Sh NAME
18fe2e029eSRobert Mustacchi.Nm ctf
19fe2e029eSRobert Mustacchi.Nd Compact C Type Format
20fe2e029eSRobert Mustacchi.Sh SYNOPSIS
21fe2e029eSRobert Mustacchi.In sys/ctf.h
22fe2e029eSRobert Mustacchi.Sh DESCRIPTION
23fe2e029eSRobert Mustacchi.Nm
24fe2e029eSRobert Mustacchiis designed to be a compact representation of the C programming
25fe2e029eSRobert Mustacchilanguage's type information focused on serving the needs of dynamic
26fe2e029eSRobert Mustacchitracing, debuggers, and other in-situ and post-mortem introspection
27fe2e029eSRobert Mustacchitools.
28fe2e029eSRobert Mustacchi.Nm
29fe2e029eSRobert Mustacchidata is generally included in
30fe2e029eSRobert Mustacchi.Sy ELF
31fe2e029eSRobert Mustacchiobjects and is tagged as
32fe2e029eSRobert Mustacchi.Sy SHT_PROGBITS
33fe2e029eSRobert Mustacchito ensure that the data is accessible in a running process and in subsequent
34fe2e029eSRobert Mustacchicore dumps, if generated.
35fe2e029eSRobert Mustacchi.Lp
36fe2e029eSRobert MustacchiThe
37fe2e029eSRobert Mustacchi.Nm
38fe2e029eSRobert Mustacchidata contained in each file has information about the layout and
39fe2e029eSRobert Mustacchisizes of C types, including intrinsic types, enumerations, structures,
40fe2e029eSRobert Mustacchitypedefs, and unions, that are used by the corresponding
41fe2e029eSRobert Mustacchi.Sy ELF
42fe2e029eSRobert Mustacchiobject. The
43fe2e029eSRobert Mustacchi.Nm
44fe2e029eSRobert Mustacchidata may also include information about the types of global objects and
45fe2e029eSRobert Mustacchithe return type and arguments of functions in the symbol table.
46fe2e029eSRobert Mustacchi.Lp
47fe2e029eSRobert MustacchiBecause a
48fe2e029eSRobert Mustacchi.Nm
49fe2e029eSRobert Mustacchifile is often embedded inside a file, rather than being a standalone
50fe2e029eSRobert Mustacchifile itself, it may also be referred to as a
51fe2e029eSRobert Mustacchi.Nm
52fe2e029eSRobert Mustacchi.Sy container .
53fe2e029eSRobert Mustacchi.Lp
54fe2e029eSRobert MustacchiOn illumos systems,
55fe2e029eSRobert Mustacchi.Nm
56fe2e029eSRobert Mustacchidata is consumed by multiple programs. It can be used by the modular
57fe2e029eSRobert Mustacchidebugger,
58fe2e029eSRobert Mustacchi.Xr mdb 1 ,
59fe2e029eSRobert Mustacchias well as by
60fe2e029eSRobert Mustacchi.Xr dtrace 1M .
61fe2e029eSRobert MustacchiProgrammatic access to
62fe2e029eSRobert Mustacchi.Nm
63fe2e029eSRobert Mustacchidata can be obtained through
64fe2e029eSRobert Mustacchi.Xr libctf 3LIB .
65fe2e029eSRobert Mustacchi.Lp
66fe2e029eSRobert MustacchiThe
67fe2e029eSRobert Mustacchi.Nm
68fe2e029eSRobert Mustacchifile format is broken down into seven different sections. The first
69fe2e029eSRobert Mustacchisection is the
70fe2e029eSRobert Mustacchi.Sy preamble
71fe2e029eSRobert Mustacchiand
72fe2e029eSRobert Mustacchi.Sy header ,
73fe2e029eSRobert Mustacchiwhich describes the version of the
74fe2e029eSRobert Mustacchi.Nm
75fe2e029eSRobert Mustacchifile, links it has to other
76fe2e029eSRobert Mustacchi.Nm
77fe2e029eSRobert Mustacchifiles, and the sizes of the other sections. The next section is the
78fe2e029eSRobert Mustacchi.Sy label
79fe2e029eSRobert Mustacchisection,
80fe2e029eSRobert Mustacchiwhich provides a way of identifying similar groups of
81fe2e029eSRobert Mustacchi.Nm
82fe2e029eSRobert Mustacchidata across multiple files. This is followed by the
83fe2e029eSRobert Mustacchi.Sy object
84fe2e029eSRobert Mustacchiinformation section, which describes the type of global
85fe2e029eSRobert Mustacchisymbols. The subsequent section is the
86fe2e029eSRobert Mustacchi.Sy function
87fe2e029eSRobert Mustacchiinformation section, which describes the return
88fe2e029eSRobert Mustacchitypes and arguments of functions. The next section is the
89fe2e029eSRobert Mustacchi.Sy type
90fe2e029eSRobert Mustacchiinformation section, which describes
91fe2e029eSRobert Mustacchithe format and layout of the C types themselves, and finally the last
92fe2e029eSRobert Mustacchisection is the
93fe2e029eSRobert Mustacchi.Sy string
94fe2e029eSRobert Mustacchisection, which contains the names of types, enumerations, members, and
95fe2e029eSRobert Mustacchilabels.
96fe2e029eSRobert Mustacchi.Lp
97fe2e029eSRobert MustacchiWhile strictly speaking, only the
98fe2e029eSRobert Mustacchi.Sy preamble
99fe2e029eSRobert Mustacchiand
100fe2e029eSRobert Mustacchi.Sy header
101fe2e029eSRobert Mustacchiare required, to be actually useful, both the type and string
102fe2e029eSRobert Mustacchisections are necessary.
103fe2e029eSRobert Mustacchi.Lp
104fe2e029eSRobert MustacchiA
105fe2e029eSRobert Mustacchi.Nm
106fe2e029eSRobert Mustacchifile may contain all of the type information that it requires, or it
107fe2e029eSRobert Mustacchimay optionally refer to another
108fe2e029eSRobert Mustacchi.Nm
109fe2e029eSRobert Mustacchifile which holds the remaining types. When a
110fe2e029eSRobert Mustacchi.Nm
111fe2e029eSRobert Mustacchifile refers to another file, it is called the
112fe2e029eSRobert Mustacchi.Sy child
113fe2e029eSRobert Mustacchiand the file it refers to is called the
114fe2e029eSRobert Mustacchi.Sy parent .
115fe2e029eSRobert MustacchiA given file may only refer to one parent. This process is called
116fe2e029eSRobert Mustacchi.Em uniquification
117fe2e029eSRobert Mustacchibecause it ensures each child only has type information that is
118fe2e029eSRobert Mustacchiunique to it. A common example of this is that most kernel modules in
119fe2e029eSRobert Mustacchiillumos are uniquified against the kernel module
120fe2e029eSRobert Mustacchi.Sy genunix
121fe2e029eSRobert Mustacchiand the type information that comes from the
122fe2e029eSRobert Mustacchi.Sy IP
123fe2e029eSRobert Mustacchimodule. This means that a module only has types that are unique to
124fe2e029eSRobert Mustacchiitself and the most common types in the kernel are not duplicated.
125fe2e029eSRobert Mustacchi.Sh FILE FORMAT
126fe2e029eSRobert MustacchiThis documents version
127fe2e029eSRobert Mustacchi.Em two
128fe2e029eSRobert Mustacchiof the
129fe2e029eSRobert Mustacchi.Nm
130fe2e029eSRobert Mustacchifile format. All applications and tools currently produce and operate on
131fe2e029eSRobert Mustacchithis version.
132fe2e029eSRobert Mustacchi.Lp
133fe2e029eSRobert MustacchiThe file format can be summarized with the following image, the
134fe2e029eSRobert Mustacchifollowing sections will cover this in more detail.
135fe2e029eSRobert Mustacchi.Bd -literal
136fe2e029eSRobert Mustacchi
137fe2e029eSRobert Mustacchi         +-------------+  0t0
138fe2e029eSRobert Mustacchi+--------| Preamble    |
139fe2e029eSRobert Mustacchi|        +-------------+  0t4
140fe2e029eSRobert Mustacchi|+-------| Header      |
141fe2e029eSRobert Mustacchi||       +-------------+  0t36 + cth_lbloff
142fe2e029eSRobert Mustacchi||+------| Labels      |
143fe2e029eSRobert Mustacchi|||      +-------------+  0t36 + cth_objtoff
144fe2e029eSRobert Mustacchi|||+-----| Objects     |
145fe2e029eSRobert Mustacchi||||     +-------------+  0t36 + cth_funcoff
146fe2e029eSRobert Mustacchi||||+----| Functions   |
147fe2e029eSRobert Mustacchi|||||    +-------------+  0t36 + cth_typeoff
148fe2e029eSRobert Mustacchi|||||+---| Types       |
149fe2e029eSRobert Mustacchi||||||   +-------------+  0t36 + cth_stroff
150fe2e029eSRobert Mustacchi||||||+--| Strings     |
151fe2e029eSRobert Mustacchi|||||||  +-------------+  0t36 + cth_stroff + cth_strlen
152fe2e029eSRobert Mustacchi|||||||
153fe2e029eSRobert Mustacchi|||||||
154fe2e029eSRobert Mustacchi|||||||
155fe2e029eSRobert Mustacchi|||||||    +-- magic -   vers   flags
156fe2e029eSRobert Mustacchi|||||||    |          |    |      |
157fe2e029eSRobert Mustacchi|||||||   +------+------+------+------+
158fe2e029eSRobert Mustacchi+---------| 0xcf | 0xf1 | 0x02 | 0x00 |
159fe2e029eSRobert Mustacchi ||||||   +------+------+------+------+
160fe2e029eSRobert Mustacchi ||||||   0      1      2      3      4
161fe2e029eSRobert Mustacchi ||||||
162fe2e029eSRobert Mustacchi ||||||    + parent label        + objects
163fe2e029eSRobert Mustacchi ||||||    |       + parent name |     + functions    + strings
164fe2e029eSRobert Mustacchi ||||||    |       |     + label |     |      + types |       + strlen
165fe2e029eSRobert Mustacchi ||||||    |       |     |       |     |      |       |       |
166fe2e029eSRobert Mustacchi ||||||   +------+------+------+------+------+-------+-------+-------+
167fe2e029eSRobert Mustacchi +--------| 0x00 | 0x00 | 0x00 | 0x08 | 0x36 | 0x110 | 0x5f4 | 0x611 |
168fe2e029eSRobert Mustacchi  |||||   +------+------+------+------+------+-------+-------+-------+
169fe2e029eSRobert Mustacchi  |||||   0x04   0x08   0x0c   0x10   0x14    0x18    0x1c    0x20   0x24
170fe2e029eSRobert Mustacchi  |||||
171fe2e029eSRobert Mustacchi  |||||         + Label name
172fe2e029eSRobert Mustacchi  |||||         |       + Label type
173fe2e029eSRobert Mustacchi  |||||         |       |       + Next label
174fe2e029eSRobert Mustacchi  |||||         |       |       |
175fe2e029eSRobert Mustacchi  |||||       +-------+------+-----+
176fe2e029eSRobert Mustacchi  +-----------| 0x01  | 0x42 | ... |
177fe2e029eSRobert Mustacchi   ||||       +-------+------+-----+
178fe2e029eSRobert Mustacchi   ||||  cth_lbloff   +0x4   +0x8  cth_objtoff
179fe2e029eSRobert Mustacchi   ||||
180fe2e029eSRobert Mustacchi   ||||
181fe2e029eSRobert Mustacchi   |||| Symidx  0t15   0t43   0t44
182fe2e029eSRobert Mustacchi   ||||       +------+------+------+-----+
183fe2e029eSRobert Mustacchi   +----------| 0x00 | 0x42 | 0x36 | ... |
184fe2e029eSRobert Mustacchi    |||       +------+------+------+-----+
185fe2e029eSRobert Mustacchi    ||| cth_objtoff  +0x2   +0x4   +0x6   cth_funcoff
186fe2e029eSRobert Mustacchi    |||
187fe2e029eSRobert Mustacchi    |||        + CTF_TYPE_INFO         + CTF_TYPE_INFO
188fe2e029eSRobert Mustacchi    |||        |        + Return type  |
189fe2e029eSRobert Mustacchi    |||        |        |       + arg0 |
190fe2e029eSRobert Mustacchi    |||       +--------+------+------+-----+
191fe2e029eSRobert Mustacchi    +---------| 0x2c10 | 0x08 | 0x0c | ... |
192fe2e029eSRobert Mustacchi     ||       +--------+------+------+-----+
193fe2e029eSRobert Mustacchi     || cth_funcff     +0x2   +0x4   +0x6  cth_typeoff
194fe2e029eSRobert Mustacchi     ||
195fe2e029eSRobert Mustacchi     ||         + ctf_stype_t for type 1
196fe2e029eSRobert Mustacchi     ||         |  integer           + integer encoding
197fe2e029eSRobert Mustacchi     ||         |                    |          + ctf_stype_t for type 2
198fe2e029eSRobert Mustacchi     ||         |                    |          |
199fe2e029eSRobert Mustacchi     ||       +--------------------+-----------+-----+
200fe2e029eSRobert Mustacchi     +--------| 0x19 * 0xc01 * 0x0 | 0x1000000 | ... |
201fe2e029eSRobert Mustacchi      |       +--------------------+-----------+-----+
202fe2e029eSRobert Mustacchi      | cth_typeoff               +0x08      +0x0c  cth_stroff
203fe2e029eSRobert Mustacchi      |
204fe2e029eSRobert Mustacchi      |     +--- str 0
205fe2e029eSRobert Mustacchi      |     |    +--- str 1       + str 2
206fe2e029eSRobert Mustacchi      |     |    |                |
207fe2e029eSRobert Mustacchi      |     v    v                v
208fe2e029eSRobert Mustacchi      |   +----+---+---+---+----+---+---+---+---+---+----+
209fe2e029eSRobert Mustacchi      +---| \\0 | i | n | t | \\0 | f | o | o | _ | t | \\0 |
210fe2e029eSRobert Mustacchi          +----+---+---+---+----+---+---+---+---+---+----+
211fe2e029eSRobert Mustacchi          0    1   2   3   4    5   6   7   8   9   10   11
212fe2e029eSRobert Mustacchi.Ed
213fe2e029eSRobert Mustacchi.Lp
214fe2e029eSRobert MustacchiEvery
215fe2e029eSRobert Mustacchi.Nm
216fe2e029eSRobert Mustacchifile begins with a
217fe2e029eSRobert Mustacchi.Sy preamble ,
218fe2e029eSRobert Mustacchifollowed by a
219fe2e029eSRobert Mustacchi.Sy header .
220fe2e029eSRobert MustacchiThe
221fe2e029eSRobert Mustacchi.Sy preamble
222fe2e029eSRobert Mustacchiis defined as follows:
223fe2e029eSRobert Mustacchi.Bd -literal
224fe2e029eSRobert Mustacchitypedef struct ctf_preamble {
225fe2e029eSRobert Mustacchi	ushort_t ctp_magic;	/* magic number (CTF_MAGIC) */
226fe2e029eSRobert Mustacchi	uchar_t ctp_version;	/* data format version number (CTF_VERSION) */
227fe2e029eSRobert Mustacchi	uchar_t ctp_flags;	/* flags (see below) */
228fe2e029eSRobert Mustacchi} ctf_preamble_t;
229fe2e029eSRobert Mustacchi.Ed
230fe2e029eSRobert Mustacchi.Pp
231fe2e029eSRobert MustacchiThe
232fe2e029eSRobert Mustacchi.Sy preamble
233fe2e029eSRobert Mustacchiis four bytes long and must be four byte aligned.
234fe2e029eSRobert MustacchiThis
235fe2e029eSRobert Mustacchi.Sy preamble
236fe2e029eSRobert Mustacchidefines the version of the
237fe2e029eSRobert Mustacchi.Nm
238fe2e029eSRobert Mustacchifile which defines the format of the rest of the header. While the
239fe2e029eSRobert Mustacchiheader may change in subsequent versions, the preamble will not change
240fe2e029eSRobert Mustacchiacross versions, though the interpretation of its flags may change from
241fe2e029eSRobert Mustacchiversion to version. The
242fe2e029eSRobert Mustacchi.Em ctp_magic
243fe2e029eSRobert Mustacchimember defines the magic number for the
244fe2e029eSRobert Mustacchi.Nm
245fe2e029eSRobert Mustacchifile format. This must always be
246fe2e029eSRobert Mustacchi.Li 0xcff1 .
247fe2e029eSRobert MustacchiIf another value is encountered, then the file should not be treated as
248fe2e029eSRobert Mustacchia
249fe2e029eSRobert Mustacchi.Nm
250fe2e029eSRobert Mustacchifile. The
251fe2e029eSRobert Mustacchi.Em ctp_version
252fe2e029eSRobert Mustacchimember defines the version of the
253fe2e029eSRobert Mustacchi.Nm
254fe2e029eSRobert Mustacchifile. The current version is
255fe2e029eSRobert Mustacchi.Li 2 .
256fe2e029eSRobert MustacchiIt is possible to encounter an unsupported version. In that case,
257fe2e029eSRobert Mustacchisoftware should not try to parse the format, as it may have changed.
258fe2e029eSRobert MustacchiFinally, the
259fe2e029eSRobert Mustacchi.Em ctp_flags
260fe2e029eSRobert Mustacchimember describes aspects of the file which modify its interpretation.
261fe2e029eSRobert MustacchiThe following flags are currently defined:
262fe2e029eSRobert Mustacchi.Bd -literal
263fe2e029eSRobert Mustacchi#define	CTF_F_COMPRESS		0x01
264fe2e029eSRobert Mustacchi.Ed
265fe2e029eSRobert Mustacchi.Pp
266fe2e029eSRobert MustacchiThe flag
267fe2e029eSRobert Mustacchi.Sy CTF_F_COMPRESS
268fe2e029eSRobert Mustacchiindicates that the body of the
269fe2e029eSRobert Mustacchi.Nm
270fe2e029eSRobert Mustacchifile, all the data following the
271fe2e029eSRobert Mustacchi.Sy header ,
272fe2e029eSRobert Mustacchihas been compressed through the
273fe2e029eSRobert Mustacchi.Sy zlib
274fe2e029eSRobert Mustacchilibrary and its
275fe2e029eSRobert Mustacchi.Sy deflate
276fe2e029eSRobert Mustacchialgorithm. If this flag is not present, then the body has not been
277fe2e029eSRobert Mustacchicompressed and no special action is needed to interpret it. All offsets
278fe2e029eSRobert Mustacchiinto the data as described by
279fe2e029eSRobert Mustacchi.Sy header ,
280fe2e029eSRobert Mustacchialways refer to the
281fe2e029eSRobert Mustacchi.Sy uncompressed
282fe2e029eSRobert Mustacchidata.
283fe2e029eSRobert Mustacchi.Lp
284fe2e029eSRobert MustacchiIn version two of the
285fe2e029eSRobert Mustacchi.Nm
286fe2e029eSRobert Mustacchifile format, the
287fe2e029eSRobert Mustacchi.Sy header
288fe2e029eSRobert Mustacchidenotes whether whether or not this
289fe2e029eSRobert Mustacchi.Nm
290fe2e029eSRobert Mustacchifile is the child of another
291fe2e029eSRobert Mustacchi.Nm
292fe2e029eSRobert Mustacchifile and also indicates the size of the remaining sections. The
293fe2e029eSRobert Mustacchistructure for the
294fe2e029eSRobert Mustacchi.Sy header ,
295fe2e029eSRobert Mustacchilogically contains a copy of the
296fe2e029eSRobert Mustacchi.Sy preamble
297fe2e029eSRobert Mustacchiand the two have a combined size of 36 bytes.
298fe2e029eSRobert Mustacchi.Bd -literal
299fe2e029eSRobert Mustacchitypedef struct ctf_header {
300fe2e029eSRobert Mustacchi	ctf_preamble_t cth_preamble;
301fe2e029eSRobert Mustacchi	uint_t cth_parlabel;	/* ref to name of parent lbl uniq'd against */
302fe2e029eSRobert Mustacchi	uint_t cth_parname;	/* ref to basename of parent */
303fe2e029eSRobert Mustacchi	uint_t cth_lbloff;	/* offset of label section */
304fe2e029eSRobert Mustacchi	uint_t cth_objtoff;	/* offset of object section */
305fe2e029eSRobert Mustacchi	uint_t cth_funcoff;	/* offset of function section */
306fe2e029eSRobert Mustacchi	uint_t cth_typeoff;	/* offset of type section */
307fe2e029eSRobert Mustacchi	uint_t cth_stroff;	/* offset of string section */
308fe2e029eSRobert Mustacchi	uint_t cth_strlen;	/* length of string section in bytes */
309fe2e029eSRobert Mustacchi} ctf_header_t;
310fe2e029eSRobert Mustacchi.Ed
311fe2e029eSRobert Mustacchi.Pp
312fe2e029eSRobert MustacchiAfter the
313fe2e029eSRobert Mustacchi.Sy preamble ,
314fe2e029eSRobert Mustacchithe next two members
315fe2e029eSRobert Mustacchi.Em cth_parlablel
316fe2e029eSRobert Mustacchiand
317fe2e029eSRobert Mustacchi.Em cth_parname ,
318fe2e029eSRobert Mustacchiare used to identify the parent. The value of both members are offsets
319fe2e029eSRobert Mustacchiinto the
320fe2e029eSRobert Mustacchi.Sy string
321fe2e029eSRobert Mustacchisection which point to the start of a null-terminated string. For more
322fe2e029eSRobert Mustacchiinformation on the encoding of strings, see the subsection on
323fe2e029eSRobert Mustacchi.Sx String Identifiers .
324fe2e029eSRobert MustacchiIf the value of either is zero, then there is no entry for that
325fe2e029eSRobert Mustacchimember. If the member
326fe2e029eSRobert Mustacchi.Em cth_parlabel
327fe2e029eSRobert Mustacchiis set, then the
328fe2e029eSRobert Mustacchi.Em ctf_parname
329fe2e029eSRobert Mustacchimember must be set, otherwise it will not be possible to find the
330fe2e029eSRobert Mustacchiparent. If
331fe2e029eSRobert Mustacchi.Em ctf_parname
332fe2e029eSRobert Mustacchiis set, it is not necessary to define
333fe2e029eSRobert Mustacchi.Em cth_parlabel ,
334fe2e029eSRobert Mustacchias the parent may not have a label. For more information on labels
335fe2e029eSRobert Mustacchiand their interpretation, see
336fe2e029eSRobert Mustacchi.Sx The Label Section .
337fe2e029eSRobert Mustacchi.Lp
338fe2e029eSRobert MustacchiThe remaining members (excepting
339fe2e029eSRobert Mustacchi.Em cth_strlen )
340fe2e029eSRobert Mustacchidescribe the beginning of the corresponding sections. These offsets are
341fe2e029eSRobert Mustacchirelative to the end of the
342fe2e029eSRobert Mustacchi.Sy header .
343fe2e029eSRobert MustacchiTherefore, something with an offset of 0 is at an offset of thirty-six
344fe2e029eSRobert Mustacchibytes relative to the start of the
345fe2e029eSRobert Mustacchi.Nm
346fe2e029eSRobert Mustacchifile. The difference between members
347fe2e029eSRobert Mustacchiindicates the size of the section itself. Different offsets have
348fe2e029eSRobert Mustacchidifferent alignment requirements. The start of the
349fe2e029eSRobert Mustacchi.Em cth_objotoff
350fe2e029eSRobert Mustacchiand
351fe2e029eSRobert Mustacchi.Em cth_funcoff
352fe2e029eSRobert Mustacchimust be two byte aligned, while the sections
353fe2e029eSRobert Mustacchi.Em cth_lbloff
354fe2e029eSRobert Mustacchiand
355fe2e029eSRobert Mustacchi.Em cth_typeoff
356fe2e029eSRobert Mustacchimust be four-byte aligned. The section
357fe2e029eSRobert Mustacchi.Em cth_stroff
358fe2e029eSRobert Mustacchihas no alignment requirements. To calculate the size of a given section,
359fe2e029eSRobert Mustacchiexcepting the
360fe2e029eSRobert Mustacchi.Sy string
361fe2e029eSRobert Mustacchisection, one should subtract the offset of the section from the following one. For
362fe2e029eSRobert Mustacchiexample, the size of the
363fe2e029eSRobert Mustacchi.Sy types
364fe2e029eSRobert Mustacchisection can be calculated by subtracting
365fe2e029eSRobert Mustacchi.Em cth_stroff
366fe2e029eSRobert Mustacchifrom
367fe2e029eSRobert Mustacchi.Em cth_typeoff .
368fe2e029eSRobert Mustacchi.Lp
369fe2e029eSRobert MustacchiFinally, the member
370fe2e029eSRobert Mustacchi.Em cth_strlen
371fe2e029eSRobert Mustacchidescribes the length of the string section itself. From it, you can also
372fe2e029eSRobert Mustacchicalculate the size of the entire
373fe2e029eSRobert Mustacchi.Nm
374fe2e029eSRobert Mustacchifile by adding together the size of the
375fe2e029eSRobert Mustacchi.Sy ctf_header_t ,
376fe2e029eSRobert Mustacchithe offset of the string section in
377fe2e029eSRobert Mustacchi.Em cth_stroff ,
378fe2e029eSRobert Mustacchiand the size of the string section in
379fe2e029eSRobert Mustacchi.Em cth_srlen .
380fe2e029eSRobert Mustacchi.Ss Type Identifiers
381fe2e029eSRobert MustacchiThrough the
382fe2e029eSRobert Mustacchi.Nm ctf
383fe2e029eSRobert Mustacchidata, types are referred to by identifiers. A given
384fe2e029eSRobert Mustacchi.Nm
385fe2e029eSRobert Mustacchifile supports up to 32767 (0x7fff) types. The first valid type identifier is 0x1.
386fe2e029eSRobert MustacchiWhen a given
387fe2e029eSRobert Mustacchi.Nm
388fe2e029eSRobert Mustacchifile is a child, indicated by a non-zero entry for the
389fe2e029eSRobert Mustacchi.Sy header Ns 's
390fe2e029eSRobert Mustacchi.Em cth_parname ,
391fe2e029eSRobert Mustacchithen the first valid type identifier is 0x8000 and the last is 0xffff.
392fe2e029eSRobert MustacchiIn this case, type identifiers 0x1 through 0x7fff are references to the
393fe2e029eSRobert Mustacchiparent.
394fe2e029eSRobert Mustacchi.Lp
395fe2e029eSRobert MustacchiThe type identifier zero is a sentinel value used to indicate that there
396fe2e029eSRobert Mustacchiis no type information available or it is an unknown type.
397fe2e029eSRobert Mustacchi.Lp
398fe2e029eSRobert MustacchiThroughout the file format, the identifier is stored in different sized
399fe2e029eSRobert Mustacchivalues; however, the minimum size to represent a given identifier is a
400fe2e029eSRobert Mustacchi.Sy uint16_t .
401fe2e029eSRobert MustacchiOther consumers of
402fe2e029eSRobert Mustacchi.Nm
403fe2e029eSRobert Mustacchiinformation may use larger or opaque identifiers.
404fe2e029eSRobert Mustacchi.Ss String Identifiers
405fe2e029eSRobert MustacchiString identifiers are always encoded as four byte unsigned integers
406fe2e029eSRobert Mustacchiwhich are an offset into a string table. The
407fe2e029eSRobert Mustacchi.Nm
408fe2e029eSRobert Mustacchiformat supports two different string tables which have an identifier of
409fe2e029eSRobert Mustacchizero or one. This identifier is stored in the high-order bit of the
410fe2e029eSRobert Mustacchiunsigned four byte offset. Therefore, the maximum supported offset into
411fe2e029eSRobert Mustacchione of these tables is 0x7ffffffff.
412fe2e029eSRobert Mustacchi.Lp
413fe2e029eSRobert MustacchiTable identifier zero, always refers to the
414fe2e029eSRobert Mustacchi.Sy string
415fe2e029eSRobert Mustacchisection in the CTF file itself. String table identifier one refers to an
416fe2e029eSRobert Mustacchiexternal string table which is the ELF string table for the ELF symbol
417fe2e029eSRobert Mustacchitable associated with the
418fe2e029eSRobert Mustacchi.Nm
419fe2e029eSRobert Mustacchicontainer.
420fe2e029eSRobert Mustacchi.Ss Type Encoding
421fe2e029eSRobert MustacchiEvery
422fe2e029eSRobert Mustacchi.Nm
423fe2e029eSRobert Mustacchitype begins with metadata encoded into a
424fe2e029eSRobert Mustacchi.Sy uint16_t .
425fe2e029eSRobert MustacchiThis encoded information tells us three different pieces of information:
426fe2e029eSRobert Mustacchi.Bl -bullet -offset indent -compact
427fe2e029eSRobert Mustacchi.It
428fe2e029eSRobert MustacchiThe kind of the type
429fe2e029eSRobert Mustacchi.It
430fe2e029eSRobert MustacchiWhether this type is a root type or not
431fe2e029eSRobert Mustacchi.It
432fe2e029eSRobert MustacchiThe length of the variable data
433fe2e029eSRobert Mustacchi.El
434fe2e029eSRobert Mustacchi.Lp
435fe2e029eSRobert MustacchiThe 16 bits that make up the encoding are broken down such that you have
436fe2e029eSRobert Mustacchifive bits for the kind, one bit for indicating whether or not it is a
437fe2e029eSRobert Mustacchiroot type, and 10 bits for the variable length. This is laid out as
438fe2e029eSRobert Mustacchifollows:
439fe2e029eSRobert Mustacchi.Bd -literal -offset indent
440fe2e029eSRobert Mustacchi+--------------------+
441fe2e029eSRobert Mustacchi| kind | root | vlen |
442fe2e029eSRobert Mustacchi+--------------------+
443fe2e029eSRobert Mustacchi15   11   10   9    0
444fe2e029eSRobert Mustacchi.Ed
445fe2e029eSRobert Mustacchi.Lp
446fe2e029eSRobert MustacchiThe current version of the file format defines 14 different kinds. The
447fe2e029eSRobert Mustacchiinterpretation of these different kinds will be discussed in the section
448fe2e029eSRobert Mustacchi.Sx The Type Section .
449fe2e029eSRobert MustacchiIf a kind is encountered that is not listed below, then it is not a valid
450fe2e029eSRobert Mustacchi.Nm
451fe2e029eSRobert Mustacchifile. The kinds are defined as follows:
452fe2e029eSRobert Mustacchi.Bd -literal -offset indent
453fe2e029eSRobert Mustacchi#define	CTF_K_UNKNOWN	0
454fe2e029eSRobert Mustacchi#define	CTF_K_INTEGER	1
455fe2e029eSRobert Mustacchi#define	CTF_K_FLOAT	2
456fe2e029eSRobert Mustacchi#define	CTF_K_POINTER	3
457fe2e029eSRobert Mustacchi#define	CTF_K_ARRAY	4
458fe2e029eSRobert Mustacchi#define	CTF_K_FUNCTION	5
459fe2e029eSRobert Mustacchi#define	CTF_K_STRUCT	6
460fe2e029eSRobert Mustacchi#define	CTF_K_UNION	7
461fe2e029eSRobert Mustacchi#define	CTF_K_ENUM	8
462fe2e029eSRobert Mustacchi#define	CTF_K_FORWARD	9
463fe2e029eSRobert Mustacchi#define	CTF_K_TYPEDEF	10
464fe2e029eSRobert Mustacchi#define	CTF_K_VOLATILE	11
465fe2e029eSRobert Mustacchi#define	CTF_K_CONST	12
466fe2e029eSRobert Mustacchi#define	CTF_K_RESTRICT	13
467fe2e029eSRobert Mustacchi.Ed
468fe2e029eSRobert Mustacchi.Lp
469fe2e029eSRobert MustacchiPrograms directly reference many types; however, other types are referenced
470fe2e029eSRobert Mustacchiindirectly because they are part of some other structure. These types that are
471fe2e029eSRobert Mustacchireferenced directly and used are called
472fe2e029eSRobert Mustacchi.Sy root
473fe2e029eSRobert Mustacchitypes. Other types may be used indirectly, for example, a program may reference
474fe2e029eSRobert Mustacchia structure directly, but not one of its members which has a type. That type is
475fe2e029eSRobert Mustacchinot considered a
476fe2e029eSRobert Mustacchi.Sy root
477fe2e029eSRobert Mustacchitype. If a type is a
478fe2e029eSRobert Mustacchi.Sy root
479fe2e029eSRobert Mustacchitype, then it will have bit 10 set.
480fe2e029eSRobert Mustacchi.Lp
481fe2e029eSRobert MustacchiThe variable length section is specific to each kind and is discussed in the
482fe2e029eSRobert Mustacchisection
483fe2e029eSRobert Mustacchi.Sx The Type Section .
484fe2e029eSRobert Mustacchi.Lp
485fe2e029eSRobert MustacchiThe following macros are useful for constructing and deconstructing the encoded
486fe2e029eSRobert Mustacchitype information:
487fe2e029eSRobert Mustacchi.Bd -literal -offset indent
488fe2e029eSRobert Mustacchi
489fe2e029eSRobert Mustacchi#define	CTF_MAX_VLEN	0x3ff
490fe2e029eSRobert Mustacchi#define	CTF_INFO_KIND(info)	(((info) & 0xf800) >> 11)
491fe2e029eSRobert Mustacchi#define	CTF_INFO_ISROOT(info)	(((info) & 0x0400) >> 10)
492fe2e029eSRobert Mustacchi#define	CTF_INFO_VLEN(info)	(((info) & CTF_MAX_VLEN))
493fe2e029eSRobert Mustacchi
494fe2e029eSRobert Mustacchi#define	CTF_TYPE_INFO(kind, isroot, vlen) \\
495fe2e029eSRobert Mustacchi	(((kind) << 11) | (((isroot) ? 1 : 0) << 10) | ((vlen) & CTF_MAX_VLEN))
496fe2e029eSRobert Mustacchi.Ed
497fe2e029eSRobert Mustacchi.Ss The Label Section
498fe2e029eSRobert MustacchiWhen consuming
499fe2e029eSRobert Mustacchi.Nm
500fe2e029eSRobert Mustacchidata, it is often useful to know whether two different
501fe2e029eSRobert Mustacchi.Nm
502fe2e029eSRobert Mustacchicontainers come from the same source base and version. For example, when
503fe2e029eSRobert Mustacchibuilding illumos, there are many kernel modules that are built against a
504fe2e029eSRobert Mustacchisingle collection of source code. A label is encoded into the
505fe2e029eSRobert Mustacchi.Nm
506fe2e029eSRobert Mustacchifiles that corresponds with the particular build. This ensures that if
507fe2e029eSRobert Mustacchifiles on the system were to become mixed up from multiple releases, that
508fe2e029eSRobert Mustacchithey are not used together by tools, particularly when a child needs to
509fe2e029eSRobert Mustacchirefer to a type in the parent. Because they are linked used the type
510fe2e029eSRobert Mustacchiidentifiers, if the wrong parent is used then the wrong type will be
511fe2e029eSRobert Mustacchiencountered.
512fe2e029eSRobert Mustacchi.Lp
513fe2e029eSRobert MustacchiEach label is encoded in the file format using the following eight byte
514fe2e029eSRobert Mustacchistructure:
515fe2e029eSRobert Mustacchi.Bd -literal
516fe2e029eSRobert Mustacchitypedef struct ctf_lblent {
517fe2e029eSRobert Mustacchi	uint_t ctl_label;	/* ref to name of label */
518fe2e029eSRobert Mustacchi	uint_t ctl_typeidx;	/* last type associated with this label */
519fe2e029eSRobert Mustacchi} ctf_lblent_t;
520fe2e029eSRobert Mustacchi.Ed
521fe2e029eSRobert Mustacchi.Lp
522fe2e029eSRobert MustacchiEach label has two different components, a name and a type identifier.
523fe2e029eSRobert MustacchiThe name is encoded in the
524fe2e029eSRobert Mustacchi.Em ctl_label
525fe2e029eSRobert Mustacchimember which is in the format defined in the section
526fe2e029eSRobert Mustacchi.Sx String Identifiers .
527fe2e029eSRobert MustacchiGenerally, the names of all labels are found in the internal string
528fe2e029eSRobert Mustacchisection.
529fe2e029eSRobert Mustacchi.Lp
530fe2e029eSRobert MustacchiThe type identifier encoded in the member
531fe2e029eSRobert Mustacchi.Em ctl_typeidx
532fe2e029eSRobert Mustacchirefers to the last type identifier that a label refers to in the current
533fe2e029eSRobert Mustacchifile. Labels only refer to types in the current file, if the
534fe2e029eSRobert Mustacchi.Nm
535fe2e029eSRobert Mustacchifile is a child, then it will have the same label as its parent;
536fe2e029eSRobert Mustacchihowever, its label will only refer to its types, not its parents.
537fe2e029eSRobert Mustacchi.Lp
538fe2e029eSRobert MustacchiIt is also possible, though rather uncommon, for a
539fe2e029eSRobert Mustacchi.Nm
540fe2e029eSRobert Mustacchifile to have multiple labels. Labels are placed one after another, every
541fe2e029eSRobert Mustacchieight bytes. When multiple labels are present, types may only belong to
542fe2e029eSRobert Mustacchia single label.
543fe2e029eSRobert Mustacchi.Ss The Object Section
544fe2e029eSRobert MustacchiThe object section provides a mapping from ELF symbols of type
545fe2e029eSRobert Mustacchi.Sy STT_OBJECT
546fe2e029eSRobert Mustacchiin the symbol table to a type identifier. Every entry in this section is
547fe2e029eSRobert Mustacchia
548fe2e029eSRobert Mustacchi.Sy uint16_t
549fe2e029eSRobert Mustacchiwhich contains a type identifier as described in the section
550fe2e029eSRobert Mustacchi.Sx Type Identifiers .
551fe2e029eSRobert MustacchiIf there is no information for an object, then the type identifier 0x0
552fe2e029eSRobert Mustacchiis stored for that entry.
553fe2e029eSRobert Mustacchi.Lp
554fe2e029eSRobert MustacchiTo walk the object section, you need to have a corresponding
555fe2e029eSRobert Mustacchi.Sy symbol table
556fe2e029eSRobert Mustacchiin the ELF object that contains the
557fe2e029eSRobert Mustacchi.Nm
558fe2e029eSRobert Mustacchidata. Not every object is included in this section. Specifically, when
559fe2e029eSRobert Mustacchiwalking the symbol table. An entry is skipped if it matches any of the
560fe2e029eSRobert Mustacchifollowing conditions:
561fe2e029eSRobert Mustacchi.Lp
562fe2e029eSRobert Mustacchi.Bl -bullet -offset indent -compact
563fe2e029eSRobert Mustacchi.It
564fe2e029eSRobert MustacchiThe symbol type is not
565fe2e029eSRobert Mustacchi.Sy STT_OBJECT
566fe2e029eSRobert Mustacchi.It
567fe2e029eSRobert MustacchiThe symbol's section index is
568fe2e029eSRobert Mustacchi.Sy SHN_UNDEF
569fe2e029eSRobert Mustacchi.It
570fe2e029eSRobert MustacchiThe symbol's name offset is zero
571fe2e029eSRobert Mustacchi.It
572fe2e029eSRobert MustacchiThe symbol's section index is
573fe2e029eSRobert Mustacchi.Sy SHN_ABS
574fe2e029eSRobert Mustacchiand the value of the symbol is zero.
575fe2e029eSRobert Mustacchi.It
576fe2e029eSRobert MustacchiThe symbol's name is
577fe2e029eSRobert Mustacchi.Li _START_
578fe2e029eSRobert Mustacchior
579fe2e029eSRobert Mustacchi.Li _END_ .
580fe2e029eSRobert MustacchiThese are skipped because they are used for scoping local symbols in
581fe2e029eSRobert MustacchiELF.
582fe2e029eSRobert Mustacchi.El
583fe2e029eSRobert Mustacchi.Lp
584fe2e029eSRobert MustacchiThe following sample code shows an example of iterating the object
585fe2e029eSRobert Mustacchisection and skipping the correct symbols:
586fe2e029eSRobert Mustacchi.Bd -literal
587fe2e029eSRobert Mustacchi#include <gelf.h>
588fe2e029eSRobert Mustacchi#include <stdio.h>
589fe2e029eSRobert Mustacchi
590fe2e029eSRobert Mustacchi/*
591fe2e029eSRobert Mustacchi * Given the start of the object section in the CTF file, the number of symbols,
592fe2e029eSRobert Mustacchi * and the ELF Data sections for the symbol table and the string table, this
593fe2e029eSRobert Mustacchi * prints the type identifiers that correspond to objects. Note, a more robust
594fe2e029eSRobert Mustacchi * implementation should ensure that they don't walk beyond the end of the CTF
595fe2e029eSRobert Mustacchi * object section.
596fe2e029eSRobert Mustacchi */
597fe2e029eSRobert Mustacchistatic int
598fe2e029eSRobert Mustacchiwalk_symbols(uint16_t *objtoff, Elf_Data *symdata, Elf_Data *strdata,
599fe2e029eSRobert Mustacchi    long nsyms)
600fe2e029eSRobert Mustacchi{
601fe2e029eSRobert Mustacchi	long i;
602fe2e029eSRobert Mustacchi	uintptr_t strbase = strdata->d_buf;
603fe2e029eSRobert Mustacchi
604fe2e029eSRobert Mustacchi	for (i = 1; i < nsyms; i++, objftoff++) {
605fe2e029eSRobert Mustacchi		const char *name;
606fe2e029eSRobert Mustacchi		GElf_Sym sym;
607fe2e029eSRobert Mustacchi
608fe2e029eSRobert Mustacchi		if (gelf_getsym(symdata, i, &sym) == NULL)
609fe2e029eSRobert Mustacchi			return (1);
610fe2e029eSRobert Mustacchi
611fe2e029eSRobert Mustacchi		if (GELF_ST_TYPE(sym.st_info) != STT_OBJECT)
612fe2e029eSRobert Mustacchi			continue;
613fe2e029eSRobert Mustacchi		if (sym.st_shndx == SHN_UNDEF || sym.st_name == 0)
614fe2e029eSRobert Mustacchi			continue;
615fe2e029eSRobert Mustacchi		if (sym.st_shndx == SHN_ABS && sym.st_value == 0)
616fe2e029eSRobert Mustacchi			continue;
617fe2e029eSRobert Mustacchi		name = (const char *)(strbase + sym.st_name);
618fe2e029eSRobert Mustacchi		if (strcmp(name, "_START_") == 0 || strcmp(name, "_END_") == 0)
619fe2e029eSRobert Mustacchi			continue;
620fe2e029eSRobert Mustacchi
621fe2e029eSRobert Mustacchi		(void) printf("Symbol %d has type %d\n", i, *objtoff);
622fe2e029eSRobert Mustacchi	}
623fe2e029eSRobert Mustacchi
624fe2e029eSRobert Mustacchi	return (0);
625fe2e029eSRobert Mustacchi}
626fe2e029eSRobert Mustacchi.Ed
627fe2e029eSRobert Mustacchi.Ss The Function Section
628fe2e029eSRobert MustacchiThe function section of the
629fe2e029eSRobert Mustacchi.Nm
630fe2e029eSRobert Mustacchifile encodes the types of both the function's arguments and the function's
631fe2e029eSRobert Mustacchireturn type. Similar to
632fe2e029eSRobert Mustacchi.Sx The Object Section ,
633fe2e029eSRobert Mustacchithe function section encodes information for all symbols of type
634fe2e029eSRobert Mustacchi.Sy STT_FUNCTION ,
635fe2e029eSRobert Mustacchiexcepting those that fit specific criteria. Unlike with objects, because
636fe2e029eSRobert Mustacchifunctions have a variable number of arguments, they start with a type encoding
637fe2e029eSRobert Mustacchias defined in
638fe2e029eSRobert Mustacchi.Sx Type Encoding ,
639fe2e029eSRobert Mustacchiwhich is the size of a
640fe2e029eSRobert Mustacchi.Sy uint16_t .
641fe2e029eSRobert MustacchiFor functions which have no type information available, they are encoded as
642fe2e029eSRobert Mustacchi.Li CTF_TYPE_INFO(CTF_K_UNKNOWN, 0, 0) .
643fe2e029eSRobert MustacchiFunctions with arguments are encoded differently. Here, the variable length is
644fe2e029eSRobert Mustacchiturned into the number of arguments in the function. If a function is a
645fe2e029eSRobert Mustacchi.Sy varargs
646fe2e029eSRobert Mustacchitype function, then the number of arguments is increased by one. Functions with
647fe2e029eSRobert Mustacchitype information are encoded as:
648fe2e029eSRobert Mustacchi.Li CTF_TYPE_INFO(CTF_K_FUNCTION, 0, nargs) .
649fe2e029eSRobert Mustacchi.Lp
650fe2e029eSRobert MustacchiFor functions that have no type information, nothing else is encoded, and the
651fe2e029eSRobert Mustacchinext function is encoded. For functions with type information, the next
652fe2e029eSRobert Mustacchi.Sy uint16_t
653fe2e029eSRobert Mustacchiis encoded with the type identifier of the return type of the function. It is
654fe2e029eSRobert Mustacchifollowed by each of the type identifiers of the arguments, if any exist, in the
655fe2e029eSRobert Mustacchiorder that they appear in the function.  Therefore, argument 0 is the first type
656fe2e029eSRobert Mustacchiidentifier and so on. When a function has a final varargs argument, that is
657fe2e029eSRobert Mustacchiencoded with the type identifier of zero.
658fe2e029eSRobert Mustacchi.Lp
659fe2e029eSRobert MustacchiLike
660fe2e029eSRobert Mustacchi.Sx The Object Section ,
661fe2e029eSRobert Mustacchithe function section is encoded in the order of the symbol table. It has
662fe2e029eSRobert Mustacchisimilar, but slightly different considerations from objects. While iterating the
663fe2e029eSRobert Mustacchisymbol table, if any of the following conditions are true, then the entry is
664fe2e029eSRobert Mustacchiskipped and no corresponding entry is written:
665fe2e029eSRobert Mustacchi.Lp
666fe2e029eSRobert Mustacchi.Bl -bullet -offset indent -compact
667fe2e029eSRobert Mustacchi.It
668fe2e029eSRobert MustacchiThe symbol type is not
669fe2e029eSRobert Mustacchi.Sy STT_FUNCTION
670fe2e029eSRobert Mustacchi.It
671fe2e029eSRobert MustacchiThe symbol's section index is
672fe2e029eSRobert Mustacchi.Sy SHN_UNDEF
673fe2e029eSRobert Mustacchi.It
674fe2e029eSRobert MustacchiThe symbol's name offset is zero
675fe2e029eSRobert Mustacchi.It
676fe2e029eSRobert MustacchiThe symbol's name is
677fe2e029eSRobert Mustacchi.Li _START_
678fe2e029eSRobert Mustacchior
679fe2e029eSRobert Mustacchi.Li _END_ .
680fe2e029eSRobert MustacchiThese are skipped because they are used for scoping local symbols in
681fe2e029eSRobert MustacchiELF.
682fe2e029eSRobert Mustacchi.El
683fe2e029eSRobert Mustacchi.Ss The Type Section
684fe2e029eSRobert MustacchiThe type section is the heart of the
685fe2e029eSRobert Mustacchi.Nm
686fe2e029eSRobert Mustacchidata. It encodes all of the information about the types themselves. The base of
687fe2e029eSRobert Mustacchithe type information comes in two forms, a short form and a long form, each of
688fe2e029eSRobert Mustacchiwhich may be followed by a variable number of arguments. The following
689fe2e029eSRobert Mustacchidefinitions describe the short and long forms:
690fe2e029eSRobert Mustacchi.Bd -literal
691fe2e029eSRobert Mustacchi#define	CTF_MAX_SIZE	0xfffe	/* max size of a type in bytes */
692fe2e029eSRobert Mustacchi#define	CTF_LSIZE_SENT	0xffff	/* sentinel for ctt_size */
693fe2e029eSRobert Mustacchi#define	CTF_MAX_LSIZE	UINT64_MAX
694fe2e029eSRobert Mustacchi
695fe2e029eSRobert Mustacchitypedef struct ctf_stype {
696fe2e029eSRobert Mustacchi	uint_t ctt_name;	/* reference to name in string table */
697fe2e029eSRobert Mustacchi	ushort_t ctt_info;	/* encoded kind, variant length */
698fe2e029eSRobert Mustacchi	union {
699fe2e029eSRobert Mustacchi		ushort_t _size;	/* size of entire type in bytes */
700fe2e029eSRobert Mustacchi		ushort_t _type;	/* reference to another type */
701fe2e029eSRobert Mustacchi	} _u;
702fe2e029eSRobert Mustacchi} ctf_stype_t;
703fe2e029eSRobert Mustacchi
704fe2e029eSRobert Mustacchitypedef struct ctf_type {
705fe2e029eSRobert Mustacchi	uint_t ctt_name;	/* reference to name in string table */
706fe2e029eSRobert Mustacchi	ushort_t ctt_info;	/* encoded kind, variant length */
707fe2e029eSRobert Mustacchi	union {
708fe2e029eSRobert Mustacchi		ushort_t _size;	/* always CTF_LSIZE_SENT */
709fe2e029eSRobert Mustacchi		ushort_t _type; /* do not use */
710fe2e029eSRobert Mustacchi	} _u;
711fe2e029eSRobert Mustacchi	uint_t ctt_lsizehi;	/* high 32 bits of type size in bytes */
712fe2e029eSRobert Mustacchi	uint_t ctt_lsizelo;	/* low 32 bits of type size in bytes */
713fe2e029eSRobert Mustacchi} ctf_type_t;
714fe2e029eSRobert Mustacchi
715fe2e029eSRobert Mustacchi#define	ctt_size _u._size	/* for fundamental types that have a size */
716fe2e029eSRobert Mustacchi#define	ctt_type _u._type	/* for types that reference another type */
717fe2e029eSRobert Mustacchi.Ed
718fe2e029eSRobert Mustacchi.Pp
719fe2e029eSRobert MustacchiType sizes are stored in
720fe2e029eSRobert Mustacchi.Sy bytes .
721fe2e029eSRobert MustacchiThe basic small form uses a
722fe2e029eSRobert Mustacchi.Sy ushort_t
723fe2e029eSRobert Mustacchito store the number of bytes. If the number of bytes in a structure would exceed
724fe2e029eSRobert Mustacchi0xfffe, then the alternate form, the
725fe2e029eSRobert Mustacchi.Sy ctf_type_t ,
726fe2e029eSRobert Mustacchiis used instead. To indicate that the larger form is being used, the member
727fe2e029eSRobert Mustacchi.Em ctt_size
728fe2e029eSRobert Mustacchiis set to value of
729fe2e029eSRobert Mustacchi.Sy CTF_LSIZE_SENT
730fe2e029eSRobert Mustacchi(0xffff). In general, when going through the type section, consumers use the
731fe2e029eSRobert Mustacchi.Sy ctf_type_t
732fe2e029eSRobert Mustacchistructure, but pay attention to the value of the member
733fe2e029eSRobert Mustacchi.Em ctt_size
734fe2e029eSRobert Mustacchito determine whether they should increment their scan by the size of the
735fe2e029eSRobert Mustacchi.Sy ctf_stype_t
736fe2e029eSRobert Mustacchior
737fe2e029eSRobert Mustacchi.Sy ctf_type_t .
738fe2e029eSRobert MustacchiNot all kinds of types use
739fe2e029eSRobert Mustacchi.Sy ctt_size .
740fe2e029eSRobert MustacchiThose which do not, will always use the
741fe2e029eSRobert Mustacchi.Sy ctf_stype_t
742fe2e029eSRobert Mustacchistructure. The individual sections for each kind have more information.
743fe2e029eSRobert Mustacchi.Lp
744fe2e029eSRobert MustacchiTypes are written out in order. Therefore the first entry encountered has a type
745fe2e029eSRobert Mustacchiid of 0x1, or 0x8000 if a child. The member
746fe2e029eSRobert Mustacchi.Em ctt_name
747fe2e029eSRobert Mustacchiis encoded as described in the section
748fe2e029eSRobert Mustacchi.Sx String Identifiers .
749fe2e029eSRobert MustacchiThe string that it points to is the name of the type. If the identifier points
750fe2e029eSRobert Mustacchito an empty string (one that consists solely of a null terminator) then the type
751fe2e029eSRobert Mustacchidoes not have a name, this is common with anonymous structures and unions that
752fe2e029eSRobert Mustacchionly have a typedef to name them, as well as, pointers and qualifiers.
753fe2e029eSRobert Mustacchi.Lp
754fe2e029eSRobert MustacchiThe next member, the
755fe2e029eSRobert Mustacchi.Em ctt_info ,
756fe2e029eSRobert Mustacchiis encoded as described in the section
757fe2e029eSRobert Mustacchi.Sx Type Encoding .
758fe2e029eSRobert MustacchiThe types kind tells us how to interpret the remaining data in the
759fe2e029eSRobert Mustacchi.Sy ctf_type_t
760fe2e029eSRobert Mustacchiand any variable length data that may exist. The rest of this section will be
761fe2e029eSRobert Mustacchibroken down into the interpretation of the various kinds.
762fe2e029eSRobert Mustacchi.Ss Encoding of Integers
763fe2e029eSRobert MustacchiIntegers, which are of type
764fe2e029eSRobert Mustacchi.Sy CTF_K_INTEGER ,
765fe2e029eSRobert Mustacchihave no variable length arguments. Instead, they are followed by a four byte
766fe2e029eSRobert Mustacchi.Sy uint_t
767fe2e029eSRobert Mustacchiwhich describes their encoding. All integers must be encoded with a variable
768fe2e029eSRobert Mustacchilength of zero. The
769fe2e029eSRobert Mustacchi.Em ctt_size
770fe2e029eSRobert Mustacchimember describes the length of the integer in bytes. In general, integer sizes
771fe2e029eSRobert Mustacchiwill be rounded up to the closest power of two.
772fe2e029eSRobert Mustacchi.Lp
773fe2e029eSRobert MustacchiThe integer encoding contains three different pieces of information:
774fe2e029eSRobert Mustacchi.Bl -bullet -offset indent -compact
775fe2e029eSRobert Mustacchi.It
776fe2e029eSRobert MustacchiThe encoding of the integer
777fe2e029eSRobert Mustacchi.It
778fe2e029eSRobert MustacchiThe offset in
779fe2e029eSRobert Mustacchi.Sy bits
780fe2e029eSRobert Mustacchiof the type
781fe2e029eSRobert Mustacchi.It
782fe2e029eSRobert MustacchiThe size in
783fe2e029eSRobert Mustacchi.Sy bits
784fe2e029eSRobert Mustacchiof the type
785fe2e029eSRobert Mustacchi.El
786fe2e029eSRobert Mustacchi.Pp
787fe2e029eSRobert MustacchiThis encoding can be expressed through the following macros:
788fe2e029eSRobert Mustacchi.Bd -literal -offset indent
789fe2e029eSRobert Mustacchi#define	CTF_INT_ENCODING(data)	(((data) & 0xff000000) >> 24)
790fe2e029eSRobert Mustacchi#define	CTF_INT_OFFSET(data)	(((data) & 0x00ff0000) >> 16)
791fe2e029eSRobert Mustacchi#define	CTF_INT_BITS(data)	(((data) & 0x0000ffff))
792fe2e029eSRobert Mustacchi
793fe2e029eSRobert Mustacchi#define	CTF_INT_DATA(encoding, offset, bits) \\
794fe2e029eSRobert Mustacchi	(((encoding) << 24) | ((offset) << 16) | (bits))
795fe2e029eSRobert Mustacchi.Ed
796fe2e029eSRobert Mustacchi.Pp
797fe2e029eSRobert MustacchiThe following flags are defined for the encoding at this time:
798fe2e029eSRobert Mustacchi.Bd -literal -offset indent
799fe2e029eSRobert Mustacchi#define	CTF_INT_SIGNED		0x01
800fe2e029eSRobert Mustacchi#define	CTF_INT_CHAR		0x02
801fe2e029eSRobert Mustacchi#define	CTF_INT_BOOL		0x04
802fe2e029eSRobert Mustacchi#define	CTF_INT_VARARGS		0x08
803fe2e029eSRobert Mustacchi.Ed
804fe2e029eSRobert Mustacchi.Lp
805fe2e029eSRobert MustacchiBy default, an integer is considered to be unsigned, unless it has the
806fe2e029eSRobert Mustacchi.Sy CTF_INT_SIGNED
807fe2e029eSRobert Mustacchiflag set. If the flag
808fe2e029eSRobert Mustacchi.Sy CTF_INT_CHAR
809fe2e029eSRobert Mustacchiis set, that indicates that the integer is of a type that stores character
810fe2e029eSRobert Mustacchidata, for example the intrinsic C type
811fe2e029eSRobert Mustacchi.Sy char
812fe2e029eSRobert Mustacchiwould have the
813fe2e029eSRobert Mustacchi.Sy CTF_INT_CHAR
814fe2e029eSRobert Mustacchiflag set. If the flag
815fe2e029eSRobert Mustacchi.Sy CTF_INT_BOOL
816fe2e029eSRobert Mustacchiis set, that indicates that the integer represents a boolean type. For example,
817fe2e029eSRobert Mustacchithe intrinsic C type
818fe2e029eSRobert Mustacchi.Sy _Bool
819fe2e029eSRobert Mustacchiwould have the
820fe2e029eSRobert Mustacchi.Sy CTF_INT_BOOL
821fe2e029eSRobert Mustacchiflag set. Finally, the flag
822fe2e029eSRobert Mustacchi.Sy CTF_INT_VARARGS
823fe2e029eSRobert Mustacchiindicates that the integer is used as part of a variable number of arguments.
824fe2e029eSRobert MustacchiThis encoding is rather uncommon.
825fe2e029eSRobert Mustacchi.Ss Encoding of Floats
826fe2e029eSRobert MustacchiFloats, which are of type
827fe2e029eSRobert Mustacchi.Sy CTF_K_FLOAT ,
828fe2e029eSRobert Mustacchiare similar to their integer counterparts. They have no variable length
829fe2e029eSRobert Mustacchiarguments and are followed by a four byte encoding which describes the kind of
830fe2e029eSRobert Mustacchifloat that exists. The
831fe2e029eSRobert Mustacchi.Em ctt_size
832fe2e029eSRobert Mustacchimember is the size, in bytes, of the float. The float encoding has three
833fe2e029eSRobert Mustacchidifferent pieces of information inside of it:
834fe2e029eSRobert Mustacchi.Lp
835fe2e029eSRobert Mustacchi.Bl -bullet -offset indent -compact
836fe2e029eSRobert Mustacchi.It
837fe2e029eSRobert MustacchiThe specific kind of float that exists
838fe2e029eSRobert Mustacchi.It
839fe2e029eSRobert MustacchiThe offset in
840fe2e029eSRobert Mustacchi.Sy bits
841fe2e029eSRobert Mustacchiof the float
842fe2e029eSRobert Mustacchi.It
843fe2e029eSRobert MustacchiThe size in
844fe2e029eSRobert Mustacchi.Sy bits
845fe2e029eSRobert Mustacchiof the float
846fe2e029eSRobert Mustacchi.El
847fe2e029eSRobert Mustacchi.Lp
848fe2e029eSRobert MustacchiThis encoding can be expressed through the following macros:
849fe2e029eSRobert Mustacchi.Bd -literal -offset indent
850fe2e029eSRobert Mustacchi#define	CTF_FP_ENCODING(data)	(((data) & 0xff000000) >> 24)
851fe2e029eSRobert Mustacchi#define	CTF_FP_OFFSET(data)	(((data) & 0x00ff0000) >> 16)
852fe2e029eSRobert Mustacchi#define	CTF_FP_BITS(data)	(((data) & 0x0000ffff))
853fe2e029eSRobert Mustacchi
854fe2e029eSRobert Mustacchi#define	CTF_FP_DATA(encoding, offset, bits) \\
855fe2e029eSRobert Mustacchi	(((encoding) << 24) | ((offset) << 16) | (bits))
856fe2e029eSRobert Mustacchi.Ed
857fe2e029eSRobert Mustacchi.Lp
858fe2e029eSRobert MustacchiWhere as the encoding for integers was a series of flags, the encoding for
859fe2e029eSRobert Mustacchifloats maps to a specific kind of float. It is not a flag-based value. The kinds of floats
860fe2e029eSRobert Mustacchicorrespond to both their size, and the encoding. This covers all of the basic C
861fe2e029eSRobert Mustacchiintrinsic floating point types. The following are the different kinds of floats
862fe2e029eSRobert Mustacchirepresented in the encoding:
863fe2e029eSRobert Mustacchi.Bd -literal -offset indent
864fe2e029eSRobert Mustacchi#define	CTF_FP_SINGLE	1	/* IEEE 32-bit float encoding */
865fe2e029eSRobert Mustacchi#define	CTF_FP_DOUBLE	2	/* IEEE 64-bit float encoding */
866fe2e029eSRobert Mustacchi#define	CTF_FP_CPLX	3	/* Complex encoding */
867fe2e029eSRobert Mustacchi#define	CTF_FP_DCPLX	4	/* Double complex encoding */
868fe2e029eSRobert Mustacchi#define	CTF_FP_LDCPLX	5	/* Long double complex encoding */
869fe2e029eSRobert Mustacchi#define	CTF_FP_LDOUBLE	6	/* Long double encoding */
870fe2e029eSRobert Mustacchi#define	CTF_FP_INTRVL	7	/* Interval (2x32-bit) encoding */
871fe2e029eSRobert Mustacchi#define	CTF_FP_DINTRVL	8	/* Double interval (2x64-bit) encoding */
872fe2e029eSRobert Mustacchi#define	CTF_FP_LDINTRVL	9	/* Long double interval (2x128-bit) encoding */
873fe2e029eSRobert Mustacchi#define	CTF_FP_IMAGRY	10	/* Imaginary (32-bit) encoding */
874fe2e029eSRobert Mustacchi#define	CTF_FP_DIMAGRY	11	/* Long imaginary (64-bit) encoding */
875fe2e029eSRobert Mustacchi#define	CTF_FP_LDIMAGRY	12	/* Long double imaginary (128-bit) encoding */
876fe2e029eSRobert Mustacchi.Ed
877fe2e029eSRobert Mustacchi.Ss Encoding of Arrays
878fe2e029eSRobert MustacchiArrays, which are of type
879fe2e029eSRobert Mustacchi.Sy CTF_K_ARRAY ,
880fe2e029eSRobert Mustacchihave no variable length arguments. They are followed by a structure which
881fe2e029eSRobert Mustacchidescribes the number of elements in the array, the type identifier of the
882fe2e029eSRobert Mustacchielements in the array, and the type identifier of the index of the array. With
883fe2e029eSRobert Mustacchiarrays, the
884fe2e029eSRobert Mustacchi.Em ctt_size
885fe2e029eSRobert Mustacchimember is set to zero. The structure that follows an array is defined as:
886fe2e029eSRobert Mustacchi.Bd -literal
887fe2e029eSRobert Mustacchitypedef struct ctf_array {
888fe2e029eSRobert Mustacchi	ushort_t cta_contents;	/* reference to type of array contents */
889fe2e029eSRobert Mustacchi	ushort_t cta_index;	/* reference to type of array index */
890fe2e029eSRobert Mustacchi	uint_t cta_nelems;	/* number of elements */
891fe2e029eSRobert Mustacchi} ctf_array_t;
892fe2e029eSRobert Mustacchi.Ed
893fe2e029eSRobert Mustacchi.Lp
894fe2e029eSRobert MustacchiThe
895fe2e029eSRobert Mustacchi.Em cta_contents
896fe2e029eSRobert Mustacchiand
897fe2e029eSRobert Mustacchi.Em cta_index
898fe2e029eSRobert Mustacchimembers of the
899fe2e029eSRobert Mustacchi.Sy ctf_array_t
900fe2e029eSRobert Mustacchiare type identifiers which are encoded as per the section
901fe2e029eSRobert Mustacchi.Sx Type Identifiers .
902fe2e029eSRobert MustacchiThe member
903fe2e029eSRobert Mustacchi.Em cta_nelems
904fe2e029eSRobert Mustacchiis a simple four byte unsigned count of the number of elements. This count may
905fe2e029eSRobert Mustacchibe zero when encountering C99's flexible array members.
906fe2e029eSRobert Mustacchi.Ss Encoding of Functions
907fe2e029eSRobert MustacchiFunction types, which are of type
908fe2e029eSRobert Mustacchi.Sy CTF_K_FUNCTION ,
909fe2e029eSRobert Mustacchiuse the variable length list to be the number of arguments in the function. When
910fe2e029eSRobert Mustacchithe function has a final member which is a varargs, then the argument count is
911fe2e029eSRobert Mustacchiincremented by one to account for the variable argument. Here, the
912fe2e029eSRobert Mustacchi.Em ctt_type
913fe2e029eSRobert Mustacchimember is encoded with the type identifier of the return type of the function.
914fe2e029eSRobert MustacchiNote that the
915fe2e029eSRobert Mustacchi.Em ctt_size
916fe2e029eSRobert Mustacchimember is not used here.
917fe2e029eSRobert Mustacchi.Lp
918fe2e029eSRobert MustacchiThe variable argument list contains the type identifiers for the arguments of
919fe2e029eSRobert Mustacchithe function, if any. Each one is represented by a
920fe2e029eSRobert Mustacchi.Sy uint16_t
921fe2e029eSRobert Mustacchiand encoded according to the
922fe2e029eSRobert Mustacchi.Sx Type Identifiers
923fe2e029eSRobert Mustacchisection. If the function's last argument is of type varargs, then it is also
924fe2e029eSRobert Mustacchiwritten out, but the type identifier is zero. This is included in the count of
925fe2e029eSRobert Mustacchithe function's arguments.
926fe2e029eSRobert Mustacchi.Ss Encoding of Structures and Unions
927fe2e029eSRobert MustacchiStructures and Unions, which are encoded with
928fe2e029eSRobert Mustacchi.Sy CTF_K_STRUCT
929fe2e029eSRobert Mustacchiand
930fe2e029eSRobert Mustacchi.Sy CTF_K_UNION
931fe2e029eSRobert Mustacchirespectively,  are very similar constructs in C. The main difference
932fe2e029eSRobert Mustacchibetween them is the fact that every member of a structure follows one another,
933fe2e029eSRobert Mustacchiwhere as in a union, all members share the same memory. They are also very
934fe2e029eSRobert Mustacchisimilar in terms of their encoding in
935fe2e029eSRobert Mustacchi.Nm .
936fe2e029eSRobert MustacchiThe variable length argument for structures and unions represents the number of
937fe2e029eSRobert Mustacchimembers that they have. The value of the member
938fe2e029eSRobert Mustacchi.Em ctt_size
939fe2e029eSRobert Mustacchiis the size of the structure and union. There are two different structures which
940fe2e029eSRobert Mustacchiare used to encode members in the variable list. When the size of a structure or
941fe2e029eSRobert Mustacchiunion is greater than or equal to the large member threshold, 8192, then a
942fe2e029eSRobert Mustacchidifferent structure is used to encode the member, all members are encoded using
943fe2e029eSRobert Mustacchithe same structure. The structure for members is as follows:
944fe2e029eSRobert Mustacchi.Bd -literal
945fe2e029eSRobert Mustacchitypedef struct ctf_member {
946fe2e029eSRobert Mustacchi	uint_t ctm_name;	/* reference to name in string table */
947fe2e029eSRobert Mustacchi	ushort_t ctm_type;	/* reference to type of member */
948fe2e029eSRobert Mustacchi	ushort_t ctm_offset;	/* offset of this member in bits */
949fe2e029eSRobert Mustacchi} ctf_member_t;
950fe2e029eSRobert Mustacchi
951fe2e029eSRobert Mustacchitypedef struct ctf_lmember {
952fe2e029eSRobert Mustacchi	uint_t ctlm_name;	/* reference to name in string table */
953fe2e029eSRobert Mustacchi	ushort_t ctlm_type;	/* reference to type of member */
954fe2e029eSRobert Mustacchi	ushort_t ctlm_pad;	/* padding */
955fe2e029eSRobert Mustacchi	uint_t ctlm_offsethi;	/* high 32 bits of member offset in bits */
956fe2e029eSRobert Mustacchi	uint_t ctlm_offsetlo;	/* low 32 bits of member offset in bits */
957fe2e029eSRobert Mustacchi} ctf_lmember_t;
958fe2e029eSRobert Mustacchi.Ed
959fe2e029eSRobert Mustacchi.Lp
960fe2e029eSRobert MustacchiBoth the
961fe2e029eSRobert Mustacchi.Em ctm_name
962fe2e029eSRobert Mustacchiand
963fe2e029eSRobert Mustacchi.Em ctlm_name
964fe2e029eSRobert Mustacchirefer to the name of the member. The name is encoded as an offset into the
965fe2e029eSRobert Mustacchistring table as described by the section
966fe2e029eSRobert Mustacchi.Sx String Identifiers .
967fe2e029eSRobert MustacchiThe members
968fe2e029eSRobert Mustacchi.Sy ctm_type
969fe2e029eSRobert Mustacchiand
970fe2e029eSRobert Mustacchi.Sy ctlm_type
971fe2e029eSRobert Mustacchiboth refer to the type of the member. They are encoded as per the section
972fe2e029eSRobert Mustacchi.Sx Type Identifiers .
973fe2e029eSRobert Mustacchi.Lp
974fe2e029eSRobert MustacchiThe last piece of information that is present is the offset which describes the
975fe2e029eSRobert Mustacchioffset in memory that the member begins at. For unions, this value will always
976fe2e029eSRobert Mustacchibe zero because the start of unions in memory is always zero. For structures,
977fe2e029eSRobert Mustacchithis is the offset in
978fe2e029eSRobert Mustacchi.Sy bits
979fe2e029eSRobert Mustacchithat the member begins at. Note that a compiler may lay out a type with padding.
980fe2e029eSRobert MustacchiThis means that the difference in offset between two consecutive members may be
981fe2e029eSRobert Mustacchilarger than the size of the member. When the size of the overall structure is
982fe2e029eSRobert Mustacchistrictly less than 8192 bytes, the normal structure,
983fe2e029eSRobert Mustacchi.Sy ctf_member_t ,
984fe2e029eSRobert Mustacchiis used and the offset in bits is stored in the member
985fe2e029eSRobert Mustacchi.Em ctm_offset .
986fe2e029eSRobert MustacchiHowever, when the size of the structure is greater than or equal to 8192 bytes,
987fe2e029eSRobert Mustacchithen the number of bits is split into two 32-bit quantities. One member,
988fe2e029eSRobert Mustacchi.Em ctlm_offsethi ,
989fe2e029eSRobert Mustacchirepresents the upper 32 bits of the offset, while the other member,
990fe2e029eSRobert Mustacchi.Em ctlm_offsetlo ,
991fe2e029eSRobert Mustacchirepresents the lower 32 bits of the offset. These can be joined together to get
992fe2e029eSRobert Mustacchia 64-bit sized offset in bits by shifting the member
993fe2e029eSRobert Mustacchi.Em ctlm_offsethi
994fe2e029eSRobert Mustacchito the left by thirty two and then doing a binary or of
995fe2e029eSRobert Mustacchi.Em ctlm_offsetlo .
996fe2e029eSRobert Mustacchi.Ss Encoding of Enumerations
997fe2e029eSRobert MustacchiEnumerations, noted by the type
998fe2e029eSRobert Mustacchi.Sy CTF_K_ENUM ,
999fe2e029eSRobert Mustacchiare similar to structures. Enumerations use the variable list to note the number
1000fe2e029eSRobert Mustacchiof values that the enumeration contains, which we'll term enumerators. In C, an
1001fe2e029eSRobert Mustacchienumeration is always equivalent to the intrinsic type
1002fe2e029eSRobert Mustacchi.Sy int ,
1003fe2e029eSRobert Mustacchithus the value of the member
1004fe2e029eSRobert Mustacchi.Em ctt_size
1005fe2e029eSRobert Mustacchiis always the size of an integer which is determined based on the current model.
1006fe2e029eSRobert MustacchiFor illumos systems, this will always be 4, as an integer is always defined to
1007fe2e029eSRobert Mustacchibe 4 bytes large in both
1008fe2e029eSRobert Mustacchi.Sy ILP32
1009fe2e029eSRobert Mustacchiand
1010fe2e029eSRobert Mustacchi.Sy LP64 ,
1011fe2e029eSRobert Mustacchiregardless of the architecture.
1012fe2e029eSRobert Mustacchi.Lp
1013fe2e029eSRobert MustacchiThe enumerators encoded in an enumeration have the following structure in the
1014fe2e029eSRobert Mustacchivariable list:
1015fe2e029eSRobert Mustacchi.Bd -literal
1016fe2e029eSRobert Mustacchitypedef struct ctf_enum {
1017fe2e029eSRobert Mustacchi	uint_t cte_name;	/* reference to name in string table */
1018fe2e029eSRobert Mustacchi	int cte_value;		/* value associated with this name */
1019fe2e029eSRobert Mustacchi} ctf_enum_t;
1020fe2e029eSRobert Mustacchi.Ed
1021fe2e029eSRobert Mustacchi.Pp
1022fe2e029eSRobert MustacchiThe member
1023fe2e029eSRobert Mustacchi.Em cte_name
1024fe2e029eSRobert Mustacchirefers to the name of the enumerator's value, it is encoded according to the
1025fe2e029eSRobert Mustacchirules in the section
1026fe2e029eSRobert Mustacchi.Sx String Identifiers .
1027fe2e029eSRobert MustacchiThe member
1028fe2e029eSRobert Mustacchi.Em cte_value
1029fe2e029eSRobert Mustacchicontains the integer value of this enumerator.
1030fe2e029eSRobert Mustacchi.Ss Encoding of Forward References
1031fe2e029eSRobert MustacchiForward references, types of kind
1032fe2e029eSRobert Mustacchi.Sy CTF_K_FORWARD ,
1033fe2e029eSRobert Mustacchiin a
1034fe2e029eSRobert Mustacchi.Nm
1035fe2e029eSRobert Mustacchifile refer to types which may not have a definition at all, only a name. If
1036fe2e029eSRobert Mustacchithe
1037fe2e029eSRobert Mustacchi.Nm
1038fe2e029eSRobert Mustacchifile is a child, then it may be that the forward is resolved to an
1039fe2e029eSRobert Mustacchiactual type in the parent, otherwise the definition may be in another
1040fe2e029eSRobert Mustacchi.Nm
1041fe2e029eSRobert Mustacchicontainer or may not be known at all. The only member of the
1042fe2e029eSRobert Mustacchi.Sy ctf_type_t
1043fe2e029eSRobert Mustacchithat matters for a forward declaration is the
1044fe2e029eSRobert Mustacchi.Em ctt_name
1045fe2e029eSRobert Mustacchiwhich points to the name of the forward reference in the string table as
1046fe2e029eSRobert Mustacchidescribed earlier. There is no other information recorded for forward
1047fe2e029eSRobert Mustacchireferences.
1048fe2e029eSRobert Mustacchi.Ss Encoding of Pointers, Typedefs, Volatile, Const, and Restrict
1049fe2e029eSRobert MustacchiPointers, typedefs, volatile, const, and restrict are all similar in
1050fe2e029eSRobert Mustacchi.Nm .
1051fe2e029eSRobert MustacchiThey all refer to another type. In the case of typedefs, they provide an
1052fe2e029eSRobert Mustacchialternate name, while volatile, const, and restrict change how the type is
1053fe2e029eSRobert Mustacchiinterpreted in the C programming language. This covers the
1054fe2e029eSRobert Mustacchi.Nm
1055fe2e029eSRobert Mustacchikinds
1056fe2e029eSRobert Mustacchi.Sy CTF_K_POINTER ,
1057fe2e029eSRobert Mustacchi.Sy CTF_K_TYPEDEF ,
1058fe2e029eSRobert Mustacchi.Sy CTF_K_VOLATILE ,
1059fe2e029eSRobert Mustacchi.Sy CTF_K_RESTRICT ,
1060fe2e029eSRobert Mustacchiand
1061fe2e029eSRobert Mustacchi.Sy CTF_K_CONST .
1062fe2e029eSRobert Mustacchi.Lp
1063fe2e029eSRobert MustacchiThese types have no variable list entries and use the member
1064fe2e029eSRobert Mustacchi.Em ctt_type
1065fe2e029eSRobert Mustacchito refer to the base type that they modify.
1066fe2e029eSRobert Mustacchi.Ss Encoding of Unknown Types
1067fe2e029eSRobert MustacchiTypes with the kind
1068fe2e029eSRobert Mustacchi.Sy CTF_K_UNKNOWN
1069fe2e029eSRobert Mustacchiare used to indicate gaps in the type identifier space. These entries consume an
1070fe2e029eSRobert Mustacchiidentifier, but do not define anything. Nothing should refer to these gap
1071fe2e029eSRobert Mustacchiidentifiers.
1072fe2e029eSRobert Mustacchi.Ss Dependencies Between Types
1073fe2e029eSRobert MustacchiC types can be imagined as a directed, cyclic, graph. Structures and unions may
1074fe2e029eSRobert Mustacchirefer to each other in a way that creates a cyclic dependency. In cases such as
1075fe2e029eSRobert Mustacchithese, the entire type section must be read in and processed. Consumers must
1076fe2e029eSRobert Mustacchinot assume that every type can be laid out in dependency order; they
1077fe2e029eSRobert Mustacchicannot.
1078fe2e029eSRobert Mustacchi.Ss The String Section
1079fe2e029eSRobert MustacchiThe last section of the
1080fe2e029eSRobert Mustacchi.Nm
1081fe2e029eSRobert Mustacchifile is the
1082fe2e029eSRobert Mustacchi.Sy string
1083fe2e029eSRobert Mustacchisection. This section encodes all of the strings that appear throughout
1084fe2e029eSRobert Mustacchithe other sections. It is laid out as a series of characters followed by
1085fe2e029eSRobert Mustacchia null terminator. Generally, all names are written out in ASCII, as
1086fe2e029eSRobert Mustacchimost C compilers do not allow and characters to appear in identifiers
1087fe2e029eSRobert Mustacchioutside of a subset of ASCII. However, any extended characters sets
1088fe2e029eSRobert Mustacchishould be written out as a series of UTF-8 bytes.
1089fe2e029eSRobert Mustacchi.Lp
1090fe2e029eSRobert MustacchiThe first entry in the section, at offset zero, is a single null
1091fe2e029eSRobert Mustacchiterminator to reference the empty string. Following that, each C string
1092fe2e029eSRobert Mustacchishould be written out, including the null terminator. Offsets that refer
1093fe2e029eSRobert Mustacchito something in this section should refer to the first byte which begins
1094fe2e029eSRobert Mustacchia string. Beyond the first byte in the section being the null
1095fe2e029eSRobert Mustacchiterminator, the order of strings is unimportant.
1096fe2e029eSRobert Mustacchi.Sh Data Encoding and ELF Considerations
1097fe2e029eSRobert Mustacchi.Nm
1098fe2e029eSRobert Mustacchidata is generally included in ELF objects which specify information to
1099fe2e029eSRobert Mustacchiidentify the architecture and endianness of the file. A
1100fe2e029eSRobert Mustacchi.Nm
1101fe2e029eSRobert Mustacchicontainer inside such an object must match the endianness of the ELF
1102fe2e029eSRobert Mustacchiobject. Aside from the question of the endian encoding of data, there
1103fe2e029eSRobert Mustacchishould be no other differences between architectures. While many of the
1104fe2e029eSRobert Mustacchitypes in this document refer to non-fixed size C integral types, they
1105fe2e029eSRobert Mustacchiare equivalent in the models
1106fe2e029eSRobert Mustacchi.Sy ILP32
1107fe2e029eSRobert Mustacchiand
1108fe2e029eSRobert Mustacchi.Sy LP64 .
1109fe2e029eSRobert MustacchiIf any other model is being used with
1110fe2e029eSRobert Mustacchi.Nm
1111fe2e029eSRobert Mustacchidata that has different sizes, then it must not use the model's sizes for
1112fe2e029eSRobert Mustacchithose integral types and instead use the fixed size equivalents based on an
1113fe2e029eSRobert Mustacchi.Sy ILP32
1114fe2e029eSRobert Mustacchienvironment.
1115fe2e029eSRobert Mustacchi.Lp
1116fe2e029eSRobert MustacchiWhen placing a
1117fe2e029eSRobert Mustacchi.Nm
1118fe2e029eSRobert Mustacchicontainer inside of an ELF object, there are certain conventions that are
1119fe2e029eSRobert Mustacchiexpected for the purposes of tooling being able to find the
1120fe2e029eSRobert Mustacchi.Nm
1121fe2e029eSRobert Mustacchidata. In particular, a given ELF object should only contain a single
1122fe2e029eSRobert Mustacchi.Nm
1123fe2e029eSRobert Mustacchisection. Multiple containers should be merged together into a single
1124fe2e029eSRobert Mustacchione.
1125fe2e029eSRobert Mustacchi.Lp
1126fe2e029eSRobert MustacchiThe
1127fe2e029eSRobert Mustacchi.Nm
1128fe2e029eSRobert Mustacchifile should be included in its own ELF section. The section's name
1129fe2e029eSRobert Mustacchimust be
1130fe2e029eSRobert Mustacchi.Ql .SUNW_ctf .
1131fe2e029eSRobert MustacchiThe type of the section must be
1132fe2e029eSRobert Mustacchi.Sy SHT_PROGBITS .
1133fe2e029eSRobert MustacchiThe section should have a link set to the symbol table and its address
1134fe2e029eSRobert Mustacchialignment must be 4.
1135fe2e029eSRobert Mustacchi.Sh SEE ALSO
1136fe2e029eSRobert Mustacchi.Xr mdb 1 ,
1137fe2e029eSRobert Mustacchi.Xr dtrace 1M ,
1138fe2e029eSRobert Mustacchi.Xr gelf 3ELF ,
1139*3a005aadSYuri Pankov.Xr libelf 3LIB ,
1140fe2e029eSRobert Mustacchi.Xr a.out 4
1141