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