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