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