ctf-open.c revision 1.1.1.1.2.1 1 1.1 christos /* Opening CTF files.
2 1.1.1.1.2.1 perseant Copyright (C) 2019-2022 Free Software Foundation, Inc.
3 1.1 christos
4 1.1 christos This file is part of libctf.
5 1.1 christos
6 1.1 christos libctf is free software; you can redistribute it and/or modify it under
7 1.1 christos the terms of the GNU General Public License as published by the Free
8 1.1 christos Software Foundation; either version 3, or (at your option) any later
9 1.1 christos version.
10 1.1 christos
11 1.1 christos This program is distributed in the hope that it will be useful, but
12 1.1 christos WITHOUT ANY WARRANTY; without even the implied warranty of
13 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 1.1 christos See the GNU General Public License for more details.
15 1.1 christos
16 1.1 christos You should have received a copy of the GNU General Public License
17 1.1 christos along with this program; see the file COPYING. If not see
18 1.1 christos <http://www.gnu.org/licenses/>. */
19 1.1 christos
20 1.1 christos #include <ctf-impl.h>
21 1.1 christos #include <stddef.h>
22 1.1 christos #include <string.h>
23 1.1 christos #include <sys/types.h>
24 1.1 christos #include <elf.h>
25 1.1 christos #include "swap.h"
26 1.1 christos #include <bfd.h>
27 1.1 christos #include <zlib.h>
28 1.1 christos
29 1.1 christos static const ctf_dmodel_t _libctf_models[] = {
30 1.1 christos {"ILP32", CTF_MODEL_ILP32, 4, 1, 2, 4, 4},
31 1.1 christos {"LP64", CTF_MODEL_LP64, 8, 1, 2, 4, 8},
32 1.1 christos {NULL, 0, 0, 0, 0, 0, 0}
33 1.1 christos };
34 1.1 christos
35 1.1 christos const char _CTF_SECTION[] = ".ctf";
36 1.1 christos const char _CTF_NULLSTR[] = "";
37 1.1 christos
38 1.1 christos /* Version-sensitive accessors. */
39 1.1 christos
40 1.1 christos static uint32_t
41 1.1 christos get_kind_v1 (uint32_t info)
42 1.1 christos {
43 1.1 christos return (CTF_V1_INFO_KIND (info));
44 1.1 christos }
45 1.1 christos
46 1.1 christos static uint32_t
47 1.1 christos get_root_v1 (uint32_t info)
48 1.1 christos {
49 1.1 christos return (CTF_V1_INFO_ISROOT (info));
50 1.1 christos }
51 1.1 christos
52 1.1 christos static uint32_t
53 1.1 christos get_vlen_v1 (uint32_t info)
54 1.1 christos {
55 1.1 christos return (CTF_V1_INFO_VLEN (info));
56 1.1 christos }
57 1.1 christos
58 1.1 christos static uint32_t
59 1.1 christos get_kind_v2 (uint32_t info)
60 1.1 christos {
61 1.1 christos return (CTF_V2_INFO_KIND (info));
62 1.1 christos }
63 1.1 christos
64 1.1 christos static uint32_t
65 1.1 christos get_root_v2 (uint32_t info)
66 1.1 christos {
67 1.1 christos return (CTF_V2_INFO_ISROOT (info));
68 1.1 christos }
69 1.1 christos
70 1.1 christos static uint32_t
71 1.1 christos get_vlen_v2 (uint32_t info)
72 1.1 christos {
73 1.1 christos return (CTF_V2_INFO_VLEN (info));
74 1.1 christos }
75 1.1 christos
76 1.1 christos static inline ssize_t
77 1.1.1.1.2.1 perseant get_ctt_size_common (const ctf_dict_t *fp _libctf_unused_,
78 1.1 christos const ctf_type_t *tp _libctf_unused_,
79 1.1 christos ssize_t *sizep, ssize_t *incrementp, size_t lsize,
80 1.1 christos size_t csize, size_t ctf_type_size,
81 1.1 christos size_t ctf_stype_size, size_t ctf_lsize_sent)
82 1.1 christos {
83 1.1 christos ssize_t size, increment;
84 1.1 christos
85 1.1 christos if (csize == ctf_lsize_sent)
86 1.1 christos {
87 1.1 christos size = lsize;
88 1.1 christos increment = ctf_type_size;
89 1.1 christos }
90 1.1 christos else
91 1.1 christos {
92 1.1 christos size = csize;
93 1.1 christos increment = ctf_stype_size;
94 1.1 christos }
95 1.1 christos
96 1.1 christos if (sizep)
97 1.1 christos *sizep = size;
98 1.1 christos if (incrementp)
99 1.1 christos *incrementp = increment;
100 1.1 christos
101 1.1 christos return size;
102 1.1 christos }
103 1.1 christos
104 1.1 christos static ssize_t
105 1.1.1.1.2.1 perseant get_ctt_size_v1 (const ctf_dict_t *fp, const ctf_type_t *tp,
106 1.1 christos ssize_t *sizep, ssize_t *incrementp)
107 1.1 christos {
108 1.1 christos ctf_type_v1_t *t1p = (ctf_type_v1_t *) tp;
109 1.1 christos
110 1.1 christos return (get_ctt_size_common (fp, tp, sizep, incrementp,
111 1.1 christos CTF_TYPE_LSIZE (t1p), t1p->ctt_size,
112 1.1 christos sizeof (ctf_type_v1_t), sizeof (ctf_stype_v1_t),
113 1.1 christos CTF_LSIZE_SENT_V1));
114 1.1 christos }
115 1.1 christos
116 1.1 christos /* Return the size that a v1 will be once it is converted to v2. */
117 1.1 christos
118 1.1 christos static ssize_t
119 1.1.1.1.2.1 perseant get_ctt_size_v2_unconverted (const ctf_dict_t *fp, const ctf_type_t *tp,
120 1.1 christos ssize_t *sizep, ssize_t *incrementp)
121 1.1 christos {
122 1.1 christos ctf_type_v1_t *t1p = (ctf_type_v1_t *) tp;
123 1.1 christos
124 1.1 christos return (get_ctt_size_common (fp, tp, sizep, incrementp,
125 1.1 christos CTF_TYPE_LSIZE (t1p), t1p->ctt_size,
126 1.1 christos sizeof (ctf_type_t), sizeof (ctf_stype_t),
127 1.1 christos CTF_LSIZE_SENT));
128 1.1 christos }
129 1.1 christos
130 1.1 christos static ssize_t
131 1.1.1.1.2.1 perseant get_ctt_size_v2 (const ctf_dict_t *fp, const ctf_type_t *tp,
132 1.1 christos ssize_t *sizep, ssize_t *incrementp)
133 1.1 christos {
134 1.1 christos return (get_ctt_size_common (fp, tp, sizep, incrementp,
135 1.1 christos CTF_TYPE_LSIZE (tp), tp->ctt_size,
136 1.1 christos sizeof (ctf_type_t), sizeof (ctf_stype_t),
137 1.1 christos CTF_LSIZE_SENT));
138 1.1 christos }
139 1.1 christos
140 1.1 christos static ssize_t
141 1.1.1.1.2.1 perseant get_vbytes_common (ctf_dict_t *fp, unsigned short kind,
142 1.1 christos ssize_t size _libctf_unused_, size_t vlen)
143 1.1 christos {
144 1.1 christos switch (kind)
145 1.1 christos {
146 1.1 christos case CTF_K_INTEGER:
147 1.1 christos case CTF_K_FLOAT:
148 1.1 christos return (sizeof (uint32_t));
149 1.1 christos case CTF_K_SLICE:
150 1.1 christos return (sizeof (ctf_slice_t));
151 1.1 christos case CTF_K_ENUM:
152 1.1 christos return (sizeof (ctf_enum_t) * vlen);
153 1.1 christos case CTF_K_FORWARD:
154 1.1 christos case CTF_K_UNKNOWN:
155 1.1 christos case CTF_K_POINTER:
156 1.1 christos case CTF_K_TYPEDEF:
157 1.1 christos case CTF_K_VOLATILE:
158 1.1 christos case CTF_K_CONST:
159 1.1 christos case CTF_K_RESTRICT:
160 1.1 christos return 0;
161 1.1 christos default:
162 1.1 christos ctf_set_errno (fp, ECTF_CORRUPT);
163 1.1 christos ctf_err_warn (fp, 0, 0, _("detected invalid CTF kind: %x"), kind);
164 1.1 christos return -1;
165 1.1 christos }
166 1.1 christos }
167 1.1 christos
168 1.1 christos static ssize_t
169 1.1.1.1.2.1 perseant get_vbytes_v1 (ctf_dict_t *fp, unsigned short kind, ssize_t size, size_t vlen)
170 1.1 christos {
171 1.1 christos switch (kind)
172 1.1 christos {
173 1.1 christos case CTF_K_ARRAY:
174 1.1 christos return (sizeof (ctf_array_v1_t));
175 1.1 christos case CTF_K_FUNCTION:
176 1.1 christos return (sizeof (unsigned short) * (vlen + (vlen & 1)));
177 1.1 christos case CTF_K_STRUCT:
178 1.1 christos case CTF_K_UNION:
179 1.1 christos if (size < CTF_LSTRUCT_THRESH_V1)
180 1.1 christos return (sizeof (ctf_member_v1_t) * vlen);
181 1.1 christos else
182 1.1 christos return (sizeof (ctf_lmember_v1_t) * vlen);
183 1.1 christos }
184 1.1 christos
185 1.1 christos return (get_vbytes_common (fp, kind, size, vlen));
186 1.1 christos }
187 1.1 christos
188 1.1 christos static ssize_t
189 1.1.1.1.2.1 perseant get_vbytes_v2 (ctf_dict_t *fp, unsigned short kind, ssize_t size, size_t vlen)
190 1.1 christos {
191 1.1 christos switch (kind)
192 1.1 christos {
193 1.1 christos case CTF_K_ARRAY:
194 1.1 christos return (sizeof (ctf_array_t));
195 1.1 christos case CTF_K_FUNCTION:
196 1.1 christos return (sizeof (uint32_t) * (vlen + (vlen & 1)));
197 1.1 christos case CTF_K_STRUCT:
198 1.1 christos case CTF_K_UNION:
199 1.1 christos if (size < CTF_LSTRUCT_THRESH)
200 1.1 christos return (sizeof (ctf_member_t) * vlen);
201 1.1 christos else
202 1.1 christos return (sizeof (ctf_lmember_t) * vlen);
203 1.1 christos }
204 1.1 christos
205 1.1 christos return (get_vbytes_common (fp, kind, size, vlen));
206 1.1 christos }
207 1.1 christos
208 1.1.1.1.2.1 perseant static const ctf_dictops_t ctf_dictops[] = {
209 1.1 christos {NULL, NULL, NULL, NULL, NULL},
210 1.1 christos /* CTF_VERSION_1 */
211 1.1 christos {get_kind_v1, get_root_v1, get_vlen_v1, get_ctt_size_v1, get_vbytes_v1},
212 1.1 christos /* CTF_VERSION_1_UPGRADED_3 */
213 1.1 christos {get_kind_v2, get_root_v2, get_vlen_v2, get_ctt_size_v2, get_vbytes_v2},
214 1.1 christos /* CTF_VERSION_2 */
215 1.1 christos {get_kind_v2, get_root_v2, get_vlen_v2, get_ctt_size_v2, get_vbytes_v2},
216 1.1 christos /* CTF_VERSION_3, identical to 2: only new type kinds */
217 1.1 christos {get_kind_v2, get_root_v2, get_vlen_v2, get_ctt_size_v2, get_vbytes_v2},
218 1.1 christos };
219 1.1 christos
220 1.1.1.1.2.1 perseant /* Initialize the symtab translation table as appropriate for its indexing
221 1.1.1.1.2.1 perseant state. For unindexed symtypetabs, fill each entry with the offset of the CTF
222 1.1.1.1.2.1 perseant type or function data corresponding to each STT_FUNC or STT_OBJECT entry in
223 1.1.1.1.2.1 perseant the symbol table. For indexed symtypetabs, do nothing: the needed
224 1.1.1.1.2.1 perseant initialization for indexed lookups may be quite expensive, so it is done only
225 1.1.1.1.2.1 perseant as needed, when lookups happen. (In particular, the majority of indexed
226 1.1.1.1.2.1 perseant symtypetabs come from the compiler, and all the linker does is iteration over
227 1.1.1.1.2.1 perseant all entries, which doesn't need this initialization.)
228 1.1.1.1.2.1 perseant
229 1.1.1.1.2.1 perseant The SP symbol table section may be NULL if there is no symtab.
230 1.1.1.1.2.1 perseant
231 1.1.1.1.2.1 perseant If init_symtab works on one call, it cannot fail on future calls to the same
232 1.1.1.1.2.1 perseant fp: ctf_symsect_endianness relies on this. */
233 1.1 christos
234 1.1 christos static int
235 1.1.1.1.2.1 perseant init_symtab (ctf_dict_t *fp, const ctf_header_t *hp, const ctf_sect_t *sp)
236 1.1 christos {
237 1.1.1.1.2.1 perseant const unsigned char *symp;
238 1.1.1.1.2.1 perseant int skip_func_info = 0;
239 1.1.1.1.2.1 perseant int i;
240 1.1 christos uint32_t *xp = fp->ctf_sxlate;
241 1.1.1.1.2.1 perseant uint32_t *xend = PTR_ADD (xp, fp->ctf_nsyms);
242 1.1 christos
243 1.1 christos uint32_t objtoff = hp->cth_objtoff;
244 1.1 christos uint32_t funcoff = hp->cth_funcoff;
245 1.1 christos
246 1.1.1.1.2.1 perseant /* If the CTF_F_NEWFUNCINFO flag is not set, pretend the func info section
247 1.1.1.1.2.1 perseant is empty: this compiler is too old to emit a function info section we
248 1.1.1.1.2.1 perseant understand. */
249 1.1.1.1.2.1 perseant
250 1.1.1.1.2.1 perseant if (!(hp->cth_flags & CTF_F_NEWFUNCINFO))
251 1.1.1.1.2.1 perseant skip_func_info = 1;
252 1.1.1.1.2.1 perseant
253 1.1.1.1.2.1 perseant if (hp->cth_objtidxoff < hp->cth_funcidxoff)
254 1.1.1.1.2.1 perseant fp->ctf_objtidx_names = (uint32_t *) (fp->ctf_buf + hp->cth_objtidxoff);
255 1.1.1.1.2.1 perseant if (hp->cth_funcidxoff < hp->cth_varoff && !skip_func_info)
256 1.1.1.1.2.1 perseant fp->ctf_funcidx_names = (uint32_t *) (fp->ctf_buf + hp->cth_funcidxoff);
257 1.1.1.1.2.1 perseant
258 1.1.1.1.2.1 perseant /* Don't bother doing the rest if everything is indexed, or if we don't have a
259 1.1.1.1.2.1 perseant symbol table: we will never use it. */
260 1.1.1.1.2.1 perseant if ((fp->ctf_objtidx_names && fp->ctf_funcidx_names) || !sp || !sp->cts_data)
261 1.1.1.1.2.1 perseant return 0;
262 1.1.1.1.2.1 perseant
263 1.1.1.1.2.1 perseant /* The CTF data object and function type sections are ordered to match the
264 1.1.1.1.2.1 perseant relative order of the respective symbol types in the symtab, unless there
265 1.1.1.1.2.1 perseant is an index section, in which case the order is arbitrary and the index
266 1.1.1.1.2.1 perseant gives the mapping. If no type information is available for a symbol table
267 1.1.1.1.2.1 perseant entry, a pad is inserted in the CTF section. As a further optimization,
268 1.1.1.1.2.1 perseant anonymous or undefined symbols are omitted from the CTF data. If an
269 1.1.1.1.2.1 perseant index is available for function symbols but not object symbols, or vice
270 1.1.1.1.2.1 perseant versa, we populate the xslate table for the unindexed symbols only. */
271 1.1 christos
272 1.1.1.1.2.1 perseant for (i = 0, symp = sp->cts_data; xp < xend; xp++, symp += sp->cts_entsize,
273 1.1.1.1.2.1 perseant i++)
274 1.1 christos {
275 1.1.1.1.2.1 perseant ctf_link_sym_t sym;
276 1.1 christos
277 1.1.1.1.2.1 perseant switch (sp->cts_entsize)
278 1.1.1.1.2.1 perseant {
279 1.1.1.1.2.1 perseant case sizeof (Elf64_Sym):
280 1.1.1.1.2.1 perseant {
281 1.1.1.1.2.1 perseant const Elf64_Sym *symp64 = (Elf64_Sym *) (uintptr_t) symp;
282 1.1.1.1.2.1 perseant ctf_elf64_to_link_sym (fp, &sym, symp64, i);
283 1.1.1.1.2.1 perseant }
284 1.1.1.1.2.1 perseant break;
285 1.1.1.1.2.1 perseant case sizeof (Elf32_Sym):
286 1.1.1.1.2.1 perseant {
287 1.1.1.1.2.1 perseant const Elf32_Sym *symp32 = (Elf32_Sym *) (uintptr_t) symp;
288 1.1.1.1.2.1 perseant ctf_elf32_to_link_sym (fp, &sym, symp32, i);
289 1.1.1.1.2.1 perseant }
290 1.1.1.1.2.1 perseant break;
291 1.1.1.1.2.1 perseant default:
292 1.1.1.1.2.1 perseant return ECTF_SYMTAB;
293 1.1.1.1.2.1 perseant }
294 1.1 christos
295 1.1.1.1.2.1 perseant /* This call may be led astray if our idea of the symtab's endianness is
296 1.1.1.1.2.1 perseant wrong, but when this is fixed by a call to ctf_symsect_endianness,
297 1.1.1.1.2.1 perseant init_symtab will be called again with the right endianness in
298 1.1.1.1.2.1 perseant force. */
299 1.1.1.1.2.1 perseant if (ctf_symtab_skippable (&sym))
300 1.1 christos {
301 1.1 christos *xp = -1u;
302 1.1 christos continue;
303 1.1 christos }
304 1.1 christos
305 1.1.1.1.2.1 perseant switch (sym.st_type)
306 1.1 christos {
307 1.1 christos case STT_OBJECT:
308 1.1.1.1.2.1 perseant if (fp->ctf_objtidx_names || objtoff >= hp->cth_funcoff)
309 1.1 christos {
310 1.1 christos *xp = -1u;
311 1.1 christos break;
312 1.1 christos }
313 1.1 christos
314 1.1 christos *xp = objtoff;
315 1.1 christos objtoff += sizeof (uint32_t);
316 1.1 christos break;
317 1.1 christos
318 1.1 christos case STT_FUNC:
319 1.1.1.1.2.1 perseant if (fp->ctf_funcidx_names || funcoff >= hp->cth_objtidxoff
320 1.1.1.1.2.1 perseant || skip_func_info)
321 1.1 christos {
322 1.1 christos *xp = -1u;
323 1.1 christos break;
324 1.1 christos }
325 1.1 christos
326 1.1 christos *xp = funcoff;
327 1.1.1.1.2.1 perseant funcoff += sizeof (uint32_t);
328 1.1 christos break;
329 1.1 christos
330 1.1 christos default:
331 1.1 christos *xp = -1u;
332 1.1 christos break;
333 1.1 christos }
334 1.1 christos }
335 1.1 christos
336 1.1 christos ctf_dprintf ("loaded %lu symtab entries\n", fp->ctf_nsyms);
337 1.1 christos return 0;
338 1.1 christos }
339 1.1 christos
340 1.1 christos /* Reset the CTF base pointer and derive the buf pointer from it, initializing
341 1.1.1.1.2.1 perseant everything in the ctf_dict that depends on the base or buf pointers.
342 1.1 christos
343 1.1 christos The original gap between the buf and base pointers, if any -- the original,
344 1.1 christos unconverted CTF header -- is kept, but its contents are not specified and are
345 1.1 christos never used. */
346 1.1 christos
347 1.1 christos static void
348 1.1.1.1.2.1 perseant ctf_set_base (ctf_dict_t *fp, const ctf_header_t *hp, unsigned char *base)
349 1.1 christos {
350 1.1 christos fp->ctf_buf = base + (fp->ctf_buf - fp->ctf_base);
351 1.1 christos fp->ctf_base = base;
352 1.1 christos fp->ctf_vars = (ctf_varent_t *) ((const char *) fp->ctf_buf +
353 1.1 christos hp->cth_varoff);
354 1.1 christos fp->ctf_nvars = (hp->cth_typeoff - hp->cth_varoff) / sizeof (ctf_varent_t);
355 1.1 christos
356 1.1 christos fp->ctf_str[CTF_STRTAB_0].cts_strs = (const char *) fp->ctf_buf
357 1.1 christos + hp->cth_stroff;
358 1.1 christos fp->ctf_str[CTF_STRTAB_0].cts_len = hp->cth_strlen;
359 1.1 christos
360 1.1.1.1.2.1 perseant /* If we have a parent dict name and label, store the relocated string
361 1.1.1.1.2.1 perseant pointers in the CTF dict for easy access later. */
362 1.1 christos
363 1.1 christos /* Note: before conversion, these will be set to values that will be
364 1.1 christos immediately invalidated by the conversion process, but the conversion
365 1.1 christos process will call ctf_set_base() again to fix things up. */
366 1.1 christos
367 1.1 christos if (hp->cth_parlabel != 0)
368 1.1 christos fp->ctf_parlabel = ctf_strptr (fp, hp->cth_parlabel);
369 1.1 christos if (hp->cth_parname != 0)
370 1.1 christos fp->ctf_parname = ctf_strptr (fp, hp->cth_parname);
371 1.1 christos if (hp->cth_cuname != 0)
372 1.1 christos fp->ctf_cuname = ctf_strptr (fp, hp->cth_cuname);
373 1.1 christos
374 1.1 christos if (fp->ctf_cuname)
375 1.1 christos ctf_dprintf ("ctf_set_base: CU name %s\n", fp->ctf_cuname);
376 1.1 christos if (fp->ctf_parname)
377 1.1 christos ctf_dprintf ("ctf_set_base: parent name %s (label %s)\n",
378 1.1 christos fp->ctf_parname,
379 1.1 christos fp->ctf_parlabel ? fp->ctf_parlabel : "<NULL>");
380 1.1 christos }
381 1.1 christos
382 1.1 christos /* Set the version of the CTF file. */
383 1.1 christos
384 1.1 christos /* When this is reset, LCTF_* changes behaviour, but there is no guarantee that
385 1.1 christos the variable data list associated with each type has been upgraded: the
386 1.1 christos caller must ensure this has been done in advance. */
387 1.1 christos
388 1.1 christos static void
389 1.1.1.1.2.1 perseant ctf_set_version (ctf_dict_t *fp, ctf_header_t *cth, int ctf_version)
390 1.1 christos {
391 1.1 christos fp->ctf_version = ctf_version;
392 1.1 christos cth->cth_version = ctf_version;
393 1.1.1.1.2.1 perseant fp->ctf_dictops = &ctf_dictops[ctf_version];
394 1.1 christos }
395 1.1 christos
396 1.1 christos
397 1.1 christos /* Upgrade the header to CTF_VERSION_3. The upgrade is done in-place. */
398 1.1 christos static void
399 1.1 christos upgrade_header (ctf_header_t *hp)
400 1.1 christos {
401 1.1 christos ctf_header_v2_t *oldhp = (ctf_header_v2_t *) hp;
402 1.1 christos
403 1.1 christos hp->cth_strlen = oldhp->cth_strlen;
404 1.1 christos hp->cth_stroff = oldhp->cth_stroff;
405 1.1 christos hp->cth_typeoff = oldhp->cth_typeoff;
406 1.1 christos hp->cth_varoff = oldhp->cth_varoff;
407 1.1 christos hp->cth_funcidxoff = hp->cth_varoff; /* No index sections. */
408 1.1 christos hp->cth_objtidxoff = hp->cth_funcidxoff;
409 1.1 christos hp->cth_funcoff = oldhp->cth_funcoff;
410 1.1 christos hp->cth_objtoff = oldhp->cth_objtoff;
411 1.1 christos hp->cth_lbloff = oldhp->cth_lbloff;
412 1.1 christos hp->cth_cuname = 0; /* No CU name. */
413 1.1 christos }
414 1.1 christos
415 1.1 christos /* Upgrade the type table to CTF_VERSION_3 (really CTF_VERSION_1_UPGRADED_3)
416 1.1 christos from CTF_VERSION_1.
417 1.1 christos
418 1.1 christos The upgrade is not done in-place: the ctf_base is moved. ctf_strptr() must
419 1.1 christos not be called before reallocation is complete.
420 1.1 christos
421 1.1 christos Sections not checked here due to nonexistence or nonpopulated state in older
422 1.1 christos formats: objtidx, funcidx.
423 1.1 christos
424 1.1 christos Type kinds not checked here due to nonexistence in older formats:
425 1.1 christos CTF_K_SLICE. */
426 1.1 christos static int
427 1.1.1.1.2.1 perseant upgrade_types_v1 (ctf_dict_t *fp, ctf_header_t *cth)
428 1.1 christos {
429 1.1 christos const ctf_type_v1_t *tbuf;
430 1.1 christos const ctf_type_v1_t *tend;
431 1.1 christos unsigned char *ctf_base, *old_ctf_base = (unsigned char *) fp->ctf_dynbase;
432 1.1 christos ctf_type_t *t2buf;
433 1.1 christos
434 1.1 christos ssize_t increase = 0, size, increment, v2increment, vbytes, v2bytes;
435 1.1 christos const ctf_type_v1_t *tp;
436 1.1 christos ctf_type_t *t2p;
437 1.1 christos
438 1.1 christos tbuf = (ctf_type_v1_t *) (fp->ctf_buf + cth->cth_typeoff);
439 1.1 christos tend = (ctf_type_v1_t *) (fp->ctf_buf + cth->cth_stroff);
440 1.1 christos
441 1.1 christos /* Much like init_types(), this is a two-pass process.
442 1.1 christos
443 1.1 christos First, figure out the new type-section size needed. (It is possible,
444 1.1 christos in theory, for it to be less than the old size, but this is very
445 1.1 christos unlikely. It cannot be so small that cth_typeoff ends up of negative
446 1.1 christos size. We validate this with an assertion below.)
447 1.1 christos
448 1.1 christos We must cater not only for changes in vlen and types sizes but also
449 1.1 christos for changes in 'increment', which happen because v2 places some types
450 1.1 christos into ctf_stype_t where v1 would be forced to use the larger non-stype. */
451 1.1 christos
452 1.1 christos for (tp = tbuf; tp < tend;
453 1.1 christos tp = (ctf_type_v1_t *) ((uintptr_t) tp + increment + vbytes))
454 1.1 christos {
455 1.1 christos unsigned short kind = CTF_V1_INFO_KIND (tp->ctt_info);
456 1.1 christos unsigned long vlen = CTF_V1_INFO_VLEN (tp->ctt_info);
457 1.1 christos
458 1.1 christos size = get_ctt_size_v1 (fp, (const ctf_type_t *) tp, NULL, &increment);
459 1.1 christos vbytes = get_vbytes_v1 (fp, kind, size, vlen);
460 1.1 christos
461 1.1 christos get_ctt_size_v2_unconverted (fp, (const ctf_type_t *) tp, NULL,
462 1.1 christos &v2increment);
463 1.1 christos v2bytes = get_vbytes_v2 (fp, kind, size, vlen);
464 1.1 christos
465 1.1 christos if ((vbytes < 0) || (size < 0))
466 1.1 christos return ECTF_CORRUPT;
467 1.1 christos
468 1.1 christos increase += v2increment - increment; /* May be negative. */
469 1.1 christos increase += v2bytes - vbytes;
470 1.1 christos }
471 1.1 christos
472 1.1 christos /* Allocate enough room for the new buffer, then copy everything but the type
473 1.1 christos section into place, and reset the base accordingly. Leave the version
474 1.1 christos number unchanged, so that LCTF_INFO_* still works on the
475 1.1 christos as-yet-untranslated type info. */
476 1.1 christos
477 1.1 christos if ((ctf_base = malloc (fp->ctf_size + increase)) == NULL)
478 1.1 christos return ECTF_ZALLOC;
479 1.1 christos
480 1.1 christos /* Start at ctf_buf, not ctf_base, to squeeze out the original header: we
481 1.1 christos never use it and it is unconverted. */
482 1.1 christos
483 1.1 christos memcpy (ctf_base, fp->ctf_buf, cth->cth_typeoff);
484 1.1 christos memcpy (ctf_base + cth->cth_stroff + increase,
485 1.1 christos fp->ctf_buf + cth->cth_stroff, cth->cth_strlen);
486 1.1 christos
487 1.1 christos memset (ctf_base + cth->cth_typeoff, 0, cth->cth_stroff - cth->cth_typeoff
488 1.1 christos + increase);
489 1.1 christos
490 1.1 christos cth->cth_stroff += increase;
491 1.1 christos fp->ctf_size += increase;
492 1.1 christos assert (cth->cth_stroff >= cth->cth_typeoff);
493 1.1 christos fp->ctf_base = ctf_base;
494 1.1 christos fp->ctf_buf = ctf_base;
495 1.1 christos fp->ctf_dynbase = ctf_base;
496 1.1 christos ctf_set_base (fp, cth, ctf_base);
497 1.1 christos
498 1.1 christos t2buf = (ctf_type_t *) (fp->ctf_buf + cth->cth_typeoff);
499 1.1 christos
500 1.1 christos /* Iterate through all the types again, upgrading them.
501 1.1 christos
502 1.1 christos Everything that hasn't changed can just be outright memcpy()ed.
503 1.1 christos Things that have changed need field-by-field consideration. */
504 1.1 christos
505 1.1 christos for (tp = tbuf, t2p = t2buf; tp < tend;
506 1.1 christos tp = (ctf_type_v1_t *) ((uintptr_t) tp + increment + vbytes),
507 1.1 christos t2p = (ctf_type_t *) ((uintptr_t) t2p + v2increment + v2bytes))
508 1.1 christos {
509 1.1 christos unsigned short kind = CTF_V1_INFO_KIND (tp->ctt_info);
510 1.1 christos int isroot = CTF_V1_INFO_ISROOT (tp->ctt_info);
511 1.1 christos unsigned long vlen = CTF_V1_INFO_VLEN (tp->ctt_info);
512 1.1 christos ssize_t v2size;
513 1.1 christos void *vdata, *v2data;
514 1.1 christos
515 1.1 christos size = get_ctt_size_v1 (fp, (const ctf_type_t *) tp, NULL, &increment);
516 1.1 christos vbytes = get_vbytes_v1 (fp, kind, size, vlen);
517 1.1 christos
518 1.1 christos t2p->ctt_name = tp->ctt_name;
519 1.1 christos t2p->ctt_info = CTF_TYPE_INFO (kind, isroot, vlen);
520 1.1 christos
521 1.1 christos switch (kind)
522 1.1 christos {
523 1.1 christos case CTF_K_FUNCTION:
524 1.1 christos case CTF_K_FORWARD:
525 1.1 christos case CTF_K_TYPEDEF:
526 1.1 christos case CTF_K_POINTER:
527 1.1 christos case CTF_K_VOLATILE:
528 1.1 christos case CTF_K_CONST:
529 1.1 christos case CTF_K_RESTRICT:
530 1.1 christos t2p->ctt_type = tp->ctt_type;
531 1.1 christos break;
532 1.1 christos case CTF_K_INTEGER:
533 1.1 christos case CTF_K_FLOAT:
534 1.1 christos case CTF_K_ARRAY:
535 1.1 christos case CTF_K_STRUCT:
536 1.1 christos case CTF_K_UNION:
537 1.1 christos case CTF_K_ENUM:
538 1.1 christos case CTF_K_UNKNOWN:
539 1.1 christos if ((size_t) size <= CTF_MAX_SIZE)
540 1.1 christos t2p->ctt_size = size;
541 1.1 christos else
542 1.1 christos {
543 1.1 christos t2p->ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
544 1.1 christos t2p->ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
545 1.1 christos }
546 1.1 christos break;
547 1.1 christos }
548 1.1 christos
549 1.1 christos v2size = get_ctt_size_v2 (fp, t2p, NULL, &v2increment);
550 1.1 christos v2bytes = get_vbytes_v2 (fp, kind, v2size, vlen);
551 1.1 christos
552 1.1 christos /* Catch out-of-sync get_ctt_size_*(). The count goes wrong if
553 1.1 christos these are not identical (and having them different makes no
554 1.1 christos sense semantically). */
555 1.1 christos
556 1.1 christos assert (size == v2size);
557 1.1 christos
558 1.1 christos /* Now the varlen info. */
559 1.1 christos
560 1.1 christos vdata = (void *) ((uintptr_t) tp + increment);
561 1.1 christos v2data = (void *) ((uintptr_t) t2p + v2increment);
562 1.1 christos
563 1.1 christos switch (kind)
564 1.1 christos {
565 1.1 christos case CTF_K_ARRAY:
566 1.1 christos {
567 1.1 christos const ctf_array_v1_t *ap = (const ctf_array_v1_t *) vdata;
568 1.1 christos ctf_array_t *a2p = (ctf_array_t *) v2data;
569 1.1 christos
570 1.1 christos a2p->cta_contents = ap->cta_contents;
571 1.1 christos a2p->cta_index = ap->cta_index;
572 1.1 christos a2p->cta_nelems = ap->cta_nelems;
573 1.1 christos break;
574 1.1 christos }
575 1.1 christos case CTF_K_STRUCT:
576 1.1 christos case CTF_K_UNION:
577 1.1 christos {
578 1.1 christos ctf_member_t tmp;
579 1.1 christos const ctf_member_v1_t *m1 = (const ctf_member_v1_t *) vdata;
580 1.1 christos const ctf_lmember_v1_t *lm1 = (const ctf_lmember_v1_t *) m1;
581 1.1 christos ctf_member_t *m2 = (ctf_member_t *) v2data;
582 1.1 christos ctf_lmember_t *lm2 = (ctf_lmember_t *) m2;
583 1.1 christos unsigned long i;
584 1.1 christos
585 1.1 christos /* We walk all four pointers forward, but only reference the two
586 1.1 christos that are valid for the given size, to avoid quadruplicating all
587 1.1 christos the code. */
588 1.1 christos
589 1.1 christos for (i = vlen; i != 0; i--, m1++, lm1++, m2++, lm2++)
590 1.1 christos {
591 1.1 christos size_t offset;
592 1.1 christos if (size < CTF_LSTRUCT_THRESH_V1)
593 1.1 christos {
594 1.1 christos offset = m1->ctm_offset;
595 1.1 christos tmp.ctm_name = m1->ctm_name;
596 1.1 christos tmp.ctm_type = m1->ctm_type;
597 1.1 christos }
598 1.1 christos else
599 1.1 christos {
600 1.1 christos offset = CTF_LMEM_OFFSET (lm1);
601 1.1 christos tmp.ctm_name = lm1->ctlm_name;
602 1.1 christos tmp.ctm_type = lm1->ctlm_type;
603 1.1 christos }
604 1.1 christos if (size < CTF_LSTRUCT_THRESH)
605 1.1 christos {
606 1.1 christos m2->ctm_name = tmp.ctm_name;
607 1.1 christos m2->ctm_type = tmp.ctm_type;
608 1.1 christos m2->ctm_offset = offset;
609 1.1 christos }
610 1.1 christos else
611 1.1 christos {
612 1.1 christos lm2->ctlm_name = tmp.ctm_name;
613 1.1 christos lm2->ctlm_type = tmp.ctm_type;
614 1.1 christos lm2->ctlm_offsethi = CTF_OFFSET_TO_LMEMHI (offset);
615 1.1 christos lm2->ctlm_offsetlo = CTF_OFFSET_TO_LMEMLO (offset);
616 1.1 christos }
617 1.1 christos }
618 1.1 christos break;
619 1.1 christos }
620 1.1 christos case CTF_K_FUNCTION:
621 1.1 christos {
622 1.1 christos unsigned long i;
623 1.1 christos unsigned short *a1 = (unsigned short *) vdata;
624 1.1 christos uint32_t *a2 = (uint32_t *) v2data;
625 1.1 christos
626 1.1 christos for (i = vlen; i != 0; i--, a1++, a2++)
627 1.1 christos *a2 = *a1;
628 1.1 christos }
629 1.1 christos /* FALLTHRU */
630 1.1 christos default:
631 1.1 christos /* Catch out-of-sync get_vbytes_*(). */
632 1.1 christos assert (vbytes == v2bytes);
633 1.1 christos memcpy (v2data, vdata, vbytes);
634 1.1 christos }
635 1.1 christos }
636 1.1 christos
637 1.1 christos /* Verify that the entire region was converted. If not, we are either
638 1.1 christos converting too much, or too little (leading to a buffer overrun either here
639 1.1 christos or at read time, in init_types().) */
640 1.1 christos
641 1.1 christos assert ((size_t) t2p - (size_t) fp->ctf_buf == cth->cth_stroff);
642 1.1 christos
643 1.1 christos ctf_set_version (fp, cth, CTF_VERSION_1_UPGRADED_3);
644 1.1 christos free (old_ctf_base);
645 1.1 christos
646 1.1 christos return 0;
647 1.1 christos }
648 1.1 christos
649 1.1 christos /* Upgrade from any earlier version. */
650 1.1 christos static int
651 1.1.1.1.2.1 perseant upgrade_types (ctf_dict_t *fp, ctf_header_t *cth)
652 1.1 christos {
653 1.1 christos switch (cth->cth_version)
654 1.1 christos {
655 1.1 christos /* v1 requires a full pass and reformatting. */
656 1.1 christos case CTF_VERSION_1:
657 1.1 christos upgrade_types_v1 (fp, cth);
658 1.1 christos /* FALLTHRU */
659 1.1 christos /* Already-converted v1 is just like later versions except that its
660 1.1 christos parent/child boundary is unchanged (and much lower). */
661 1.1 christos
662 1.1 christos case CTF_VERSION_1_UPGRADED_3:
663 1.1 christos fp->ctf_parmax = CTF_MAX_PTYPE_V1;
664 1.1 christos
665 1.1 christos /* v2 is just the same as v3 except for new types and sections:
666 1.1 christos no upgrading required. */
667 1.1 christos case CTF_VERSION_2: ;
668 1.1 christos /* FALLTHRU */
669 1.1 christos }
670 1.1 christos return 0;
671 1.1 christos }
672 1.1 christos
673 1.1 christos /* Initialize the type ID translation table with the byte offset of each type,
674 1.1 christos and initialize the hash tables of each named type. Upgrade the type table to
675 1.1 christos the latest supported representation in the process, if needed, and if this
676 1.1 christos recension of libctf supports upgrading. */
677 1.1 christos
678 1.1 christos static int
679 1.1.1.1.2.1 perseant init_types (ctf_dict_t *fp, ctf_header_t *cth)
680 1.1 christos {
681 1.1 christos const ctf_type_t *tbuf;
682 1.1 christos const ctf_type_t *tend;
683 1.1 christos
684 1.1 christos unsigned long pop[CTF_K_MAX + 1] = { 0 };
685 1.1 christos const ctf_type_t *tp;
686 1.1.1.1.2.1 perseant uint32_t id;
687 1.1 christos uint32_t *xp;
688 1.1 christos
689 1.1.1.1.2.1 perseant /* We determine whether the dict is a child or a parent based on the value of
690 1.1.1.1.2.1 perseant cth_parname. */
691 1.1 christos
692 1.1 christos int child = cth->cth_parname != 0;
693 1.1 christos int nlstructs = 0, nlunions = 0;
694 1.1 christos int err;
695 1.1 christos
696 1.1 christos assert (!(fp->ctf_flags & LCTF_RDWR));
697 1.1 christos
698 1.1 christos if (_libctf_unlikely_ (fp->ctf_version == CTF_VERSION_1))
699 1.1 christos {
700 1.1 christos int err;
701 1.1 christos if ((err = upgrade_types (fp, cth)) != 0)
702 1.1 christos return err; /* Upgrade failed. */
703 1.1 christos }
704 1.1 christos
705 1.1 christos tbuf = (ctf_type_t *) (fp->ctf_buf + cth->cth_typeoff);
706 1.1 christos tend = (ctf_type_t *) (fp->ctf_buf + cth->cth_stroff);
707 1.1 christos
708 1.1 christos /* We make two passes through the entire type section. In this first
709 1.1 christos pass, we count the number of each type and the total number of types. */
710 1.1 christos
711 1.1 christos for (tp = tbuf; tp < tend; fp->ctf_typemax++)
712 1.1 christos {
713 1.1 christos unsigned short kind = LCTF_INFO_KIND (fp, tp->ctt_info);
714 1.1 christos unsigned long vlen = LCTF_INFO_VLEN (fp, tp->ctt_info);
715 1.1 christos ssize_t size, increment, vbytes;
716 1.1 christos
717 1.1 christos (void) ctf_get_ctt_size (fp, tp, &size, &increment);
718 1.1 christos vbytes = LCTF_VBYTES (fp, kind, size, vlen);
719 1.1 christos
720 1.1 christos if (vbytes < 0)
721 1.1 christos return ECTF_CORRUPT;
722 1.1 christos
723 1.1 christos /* For forward declarations, ctt_type is the CTF_K_* kind for the tag,
724 1.1 christos so bump that population count too. */
725 1.1 christos if (kind == CTF_K_FORWARD)
726 1.1 christos pop[tp->ctt_type]++;
727 1.1 christos
728 1.1 christos tp = (ctf_type_t *) ((uintptr_t) tp + increment + vbytes);
729 1.1 christos pop[kind]++;
730 1.1 christos }
731 1.1 christos
732 1.1 christos if (child)
733 1.1 christos {
734 1.1.1.1.2.1 perseant ctf_dprintf ("CTF dict %p is a child\n", (void *) fp);
735 1.1 christos fp->ctf_flags |= LCTF_CHILD;
736 1.1 christos }
737 1.1 christos else
738 1.1.1.1.2.1 perseant ctf_dprintf ("CTF dict %p is a parent\n", (void *) fp);
739 1.1 christos
740 1.1 christos /* Now that we've counted up the number of each type, we can allocate
741 1.1 christos the hash tables, type translation table, and pointer table. */
742 1.1 christos
743 1.1 christos if ((fp->ctf_structs.ctn_readonly
744 1.1 christos = ctf_hash_create (pop[CTF_K_STRUCT], ctf_hash_string,
745 1.1 christos ctf_hash_eq_string)) == NULL)
746 1.1 christos return ENOMEM;
747 1.1 christos
748 1.1 christos if ((fp->ctf_unions.ctn_readonly
749 1.1 christos = ctf_hash_create (pop[CTF_K_UNION], ctf_hash_string,
750 1.1 christos ctf_hash_eq_string)) == NULL)
751 1.1 christos return ENOMEM;
752 1.1 christos
753 1.1 christos if ((fp->ctf_enums.ctn_readonly
754 1.1 christos = ctf_hash_create (pop[CTF_K_ENUM], ctf_hash_string,
755 1.1 christos ctf_hash_eq_string)) == NULL)
756 1.1 christos return ENOMEM;
757 1.1 christos
758 1.1 christos if ((fp->ctf_names.ctn_readonly
759 1.1.1.1.2.1 perseant = ctf_hash_create (pop[CTF_K_UNKNOWN] +
760 1.1.1.1.2.1 perseant pop[CTF_K_INTEGER] +
761 1.1 christos pop[CTF_K_FLOAT] +
762 1.1 christos pop[CTF_K_FUNCTION] +
763 1.1 christos pop[CTF_K_TYPEDEF] +
764 1.1 christos pop[CTF_K_POINTER] +
765 1.1 christos pop[CTF_K_VOLATILE] +
766 1.1 christos pop[CTF_K_CONST] +
767 1.1 christos pop[CTF_K_RESTRICT],
768 1.1 christos ctf_hash_string,
769 1.1 christos ctf_hash_eq_string)) == NULL)
770 1.1 christos return ENOMEM;
771 1.1 christos
772 1.1 christos fp->ctf_txlate = malloc (sizeof (uint32_t) * (fp->ctf_typemax + 1));
773 1.1 christos fp->ctf_ptrtab_len = fp->ctf_typemax + 1;
774 1.1 christos fp->ctf_ptrtab = malloc (sizeof (uint32_t) * fp->ctf_ptrtab_len);
775 1.1 christos
776 1.1 christos if (fp->ctf_txlate == NULL || fp->ctf_ptrtab == NULL)
777 1.1 christos return ENOMEM; /* Memory allocation failed. */
778 1.1 christos
779 1.1 christos xp = fp->ctf_txlate;
780 1.1 christos *xp++ = 0; /* Type id 0 is used as a sentinel value. */
781 1.1 christos
782 1.1 christos memset (fp->ctf_txlate, 0, sizeof (uint32_t) * (fp->ctf_typemax + 1));
783 1.1 christos memset (fp->ctf_ptrtab, 0, sizeof (uint32_t) * (fp->ctf_typemax + 1));
784 1.1 christos
785 1.1 christos /* In the second pass through the types, we fill in each entry of the
786 1.1 christos type and pointer tables and add names to the appropriate hashes. */
787 1.1 christos
788 1.1 christos for (id = 1, tp = tbuf; tp < tend; xp++, id++)
789 1.1 christos {
790 1.1 christos unsigned short kind = LCTF_INFO_KIND (fp, tp->ctt_info);
791 1.1 christos unsigned short isroot = LCTF_INFO_ISROOT (fp, tp->ctt_info);
792 1.1 christos unsigned long vlen = LCTF_INFO_VLEN (fp, tp->ctt_info);
793 1.1 christos ssize_t size, increment, vbytes;
794 1.1 christos
795 1.1 christos const char *name;
796 1.1 christos
797 1.1 christos (void) ctf_get_ctt_size (fp, tp, &size, &increment);
798 1.1 christos name = ctf_strptr (fp, tp->ctt_name);
799 1.1 christos /* Cannot fail: shielded by call in loop above. */
800 1.1 christos vbytes = LCTF_VBYTES (fp, kind, size, vlen);
801 1.1 christos
802 1.1 christos switch (kind)
803 1.1 christos {
804 1.1.1.1.2.1 perseant case CTF_K_UNKNOWN:
805 1.1 christos case CTF_K_INTEGER:
806 1.1 christos case CTF_K_FLOAT:
807 1.1 christos /* Names are reused by bit-fields, which are differentiated by their
808 1.1 christos encodings, and so typically we'd record only the first instance of
809 1.1 christos a given intrinsic. However, we replace an existing type with a
810 1.1 christos root-visible version so that we can be sure to find it when
811 1.1 christos checking for conflicting definitions in ctf_add_type(). */
812 1.1 christos
813 1.1 christos if (((ctf_hash_lookup_type (fp->ctf_names.ctn_readonly,
814 1.1 christos fp, name)) == 0)
815 1.1 christos || isroot)
816 1.1 christos {
817 1.1 christos err = ctf_hash_define_type (fp->ctf_names.ctn_readonly, fp,
818 1.1 christos LCTF_INDEX_TO_TYPE (fp, id, child),
819 1.1 christos tp->ctt_name);
820 1.1 christos if (err != 0)
821 1.1 christos return err;
822 1.1 christos }
823 1.1 christos break;
824 1.1 christos
825 1.1 christos /* These kinds have no name, so do not need interning into any
826 1.1 christos hashtables. */
827 1.1 christos case CTF_K_ARRAY:
828 1.1 christos case CTF_K_SLICE:
829 1.1 christos break;
830 1.1 christos
831 1.1 christos case CTF_K_FUNCTION:
832 1.1 christos if (!isroot)
833 1.1 christos break;
834 1.1 christos
835 1.1 christos err = ctf_hash_insert_type (fp->ctf_names.ctn_readonly, fp,
836 1.1 christos LCTF_INDEX_TO_TYPE (fp, id, child),
837 1.1 christos tp->ctt_name);
838 1.1 christos if (err != 0)
839 1.1 christos return err;
840 1.1 christos break;
841 1.1 christos
842 1.1 christos case CTF_K_STRUCT:
843 1.1 christos if (size >= CTF_LSTRUCT_THRESH)
844 1.1 christos nlstructs++;
845 1.1 christos
846 1.1 christos if (!isroot)
847 1.1 christos break;
848 1.1 christos
849 1.1 christos err = ctf_hash_define_type (fp->ctf_structs.ctn_readonly, fp,
850 1.1 christos LCTF_INDEX_TO_TYPE (fp, id, child),
851 1.1 christos tp->ctt_name);
852 1.1 christos
853 1.1 christos if (err != 0)
854 1.1 christos return err;
855 1.1 christos
856 1.1 christos break;
857 1.1 christos
858 1.1 christos case CTF_K_UNION:
859 1.1 christos if (size >= CTF_LSTRUCT_THRESH)
860 1.1 christos nlunions++;
861 1.1 christos
862 1.1 christos if (!isroot)
863 1.1 christos break;
864 1.1 christos
865 1.1 christos err = ctf_hash_define_type (fp->ctf_unions.ctn_readonly, fp,
866 1.1 christos LCTF_INDEX_TO_TYPE (fp, id, child),
867 1.1 christos tp->ctt_name);
868 1.1 christos
869 1.1 christos if (err != 0)
870 1.1 christos return err;
871 1.1 christos break;
872 1.1 christos
873 1.1 christos case CTF_K_ENUM:
874 1.1 christos if (!isroot)
875 1.1 christos break;
876 1.1 christos
877 1.1 christos err = ctf_hash_define_type (fp->ctf_enums.ctn_readonly, fp,
878 1.1 christos LCTF_INDEX_TO_TYPE (fp, id, child),
879 1.1 christos tp->ctt_name);
880 1.1 christos
881 1.1 christos if (err != 0)
882 1.1 christos return err;
883 1.1 christos break;
884 1.1 christos
885 1.1 christos case CTF_K_TYPEDEF:
886 1.1 christos if (!isroot)
887 1.1 christos break;
888 1.1 christos
889 1.1 christos err = ctf_hash_insert_type (fp->ctf_names.ctn_readonly, fp,
890 1.1 christos LCTF_INDEX_TO_TYPE (fp, id, child),
891 1.1 christos tp->ctt_name);
892 1.1 christos if (err != 0)
893 1.1 christos return err;
894 1.1 christos break;
895 1.1 christos
896 1.1 christos case CTF_K_FORWARD:
897 1.1 christos {
898 1.1 christos ctf_names_t *np = ctf_name_table (fp, tp->ctt_type);
899 1.1 christos
900 1.1 christos if (!isroot)
901 1.1 christos break;
902 1.1 christos
903 1.1 christos /* Only insert forward tags into the given hash if the type or tag
904 1.1 christos name is not already present. */
905 1.1 christos if (ctf_hash_lookup_type (np->ctn_readonly, fp, name) == 0)
906 1.1 christos {
907 1.1 christos err = ctf_hash_insert_type (np->ctn_readonly, fp,
908 1.1 christos LCTF_INDEX_TO_TYPE (fp, id, child),
909 1.1 christos tp->ctt_name);
910 1.1 christos if (err != 0)
911 1.1 christos return err;
912 1.1 christos }
913 1.1 christos break;
914 1.1 christos }
915 1.1 christos
916 1.1 christos case CTF_K_POINTER:
917 1.1.1.1.2.1 perseant /* If the type referenced by the pointer is in this CTF dict, then
918 1.1.1.1.2.1 perseant store the index of the pointer type in fp->ctf_ptrtab[ index of
919 1.1.1.1.2.1 perseant referenced type ]. */
920 1.1 christos
921 1.1 christos if (LCTF_TYPE_ISCHILD (fp, tp->ctt_type) == child
922 1.1 christos && LCTF_TYPE_TO_INDEX (fp, tp->ctt_type) <= fp->ctf_typemax)
923 1.1 christos fp->ctf_ptrtab[LCTF_TYPE_TO_INDEX (fp, tp->ctt_type)] = id;
924 1.1 christos /*FALLTHRU*/
925 1.1 christos
926 1.1 christos case CTF_K_VOLATILE:
927 1.1 christos case CTF_K_CONST:
928 1.1 christos case CTF_K_RESTRICT:
929 1.1 christos if (!isroot)
930 1.1 christos break;
931 1.1 christos
932 1.1 christos err = ctf_hash_insert_type (fp->ctf_names.ctn_readonly, fp,
933 1.1 christos LCTF_INDEX_TO_TYPE (fp, id, child),
934 1.1 christos tp->ctt_name);
935 1.1 christos if (err != 0)
936 1.1 christos return err;
937 1.1 christos break;
938 1.1 christos default:
939 1.1 christos ctf_err_warn (fp, 0, ECTF_CORRUPT,
940 1.1 christos _("init_types(): unhandled CTF kind: %x"), kind);
941 1.1 christos return ECTF_CORRUPT;
942 1.1 christos }
943 1.1 christos
944 1.1 christos *xp = (uint32_t) ((uintptr_t) tp - (uintptr_t) fp->ctf_buf);
945 1.1 christos tp = (ctf_type_t *) ((uintptr_t) tp + increment + vbytes);
946 1.1 christos }
947 1.1 christos
948 1.1 christos ctf_dprintf ("%lu total types processed\n", fp->ctf_typemax);
949 1.1 christos ctf_dprintf ("%u enum names hashed\n",
950 1.1 christos ctf_hash_size (fp->ctf_enums.ctn_readonly));
951 1.1 christos ctf_dprintf ("%u struct names hashed (%d long)\n",
952 1.1 christos ctf_hash_size (fp->ctf_structs.ctn_readonly), nlstructs);
953 1.1 christos ctf_dprintf ("%u union names hashed (%d long)\n",
954 1.1 christos ctf_hash_size (fp->ctf_unions.ctn_readonly), nlunions);
955 1.1 christos ctf_dprintf ("%u base type names hashed\n",
956 1.1 christos ctf_hash_size (fp->ctf_names.ctn_readonly));
957 1.1 christos
958 1.1 christos return 0;
959 1.1 christos }
960 1.1 christos
961 1.1 christos /* Endianness-flipping routines.
962 1.1 christos
963 1.1 christos We flip everything, mindlessly, even 1-byte entities, so that future
964 1.1 christos expansions do not require changes to this code. */
965 1.1 christos
966 1.1 christos /* Flip the endianness of the CTF header. */
967 1.1 christos
968 1.1.1.1.2.1 perseant void
969 1.1.1.1.2.1 perseant ctf_flip_header (ctf_header_t *cth)
970 1.1 christos {
971 1.1 christos swap_thing (cth->cth_preamble.ctp_magic);
972 1.1 christos swap_thing (cth->cth_preamble.ctp_version);
973 1.1 christos swap_thing (cth->cth_preamble.ctp_flags);
974 1.1 christos swap_thing (cth->cth_parlabel);
975 1.1 christos swap_thing (cth->cth_parname);
976 1.1 christos swap_thing (cth->cth_cuname);
977 1.1 christos swap_thing (cth->cth_objtoff);
978 1.1 christos swap_thing (cth->cth_funcoff);
979 1.1 christos swap_thing (cth->cth_objtidxoff);
980 1.1 christos swap_thing (cth->cth_funcidxoff);
981 1.1 christos swap_thing (cth->cth_varoff);
982 1.1 christos swap_thing (cth->cth_typeoff);
983 1.1 christos swap_thing (cth->cth_stroff);
984 1.1 christos swap_thing (cth->cth_strlen);
985 1.1 christos }
986 1.1 christos
987 1.1 christos /* Flip the endianness of the label section, an array of ctf_lblent_t. */
988 1.1 christos
989 1.1 christos static void
990 1.1 christos flip_lbls (void *start, size_t len)
991 1.1 christos {
992 1.1 christos ctf_lblent_t *lbl = start;
993 1.1 christos ssize_t i;
994 1.1 christos
995 1.1 christos for (i = len / sizeof (struct ctf_lblent); i > 0; lbl++, i--)
996 1.1 christos {
997 1.1 christos swap_thing (lbl->ctl_label);
998 1.1 christos swap_thing (lbl->ctl_type);
999 1.1 christos }
1000 1.1 christos }
1001 1.1 christos
1002 1.1 christos /* Flip the endianness of the data-object or function sections or their indexes,
1003 1.1.1.1.2.1 perseant all arrays of uint32_t. */
1004 1.1 christos
1005 1.1 christos static void
1006 1.1 christos flip_objts (void *start, size_t len)
1007 1.1 christos {
1008 1.1 christos uint32_t *obj = start;
1009 1.1 christos ssize_t i;
1010 1.1 christos
1011 1.1 christos for (i = len / sizeof (uint32_t); i > 0; obj++, i--)
1012 1.1 christos swap_thing (*obj);
1013 1.1 christos }
1014 1.1 christos
1015 1.1 christos /* Flip the endianness of the variable section, an array of ctf_varent_t. */
1016 1.1 christos
1017 1.1 christos static void
1018 1.1 christos flip_vars (void *start, size_t len)
1019 1.1 christos {
1020 1.1 christos ctf_varent_t *var = start;
1021 1.1 christos ssize_t i;
1022 1.1 christos
1023 1.1 christos for (i = len / sizeof (struct ctf_varent); i > 0; var++, i--)
1024 1.1 christos {
1025 1.1 christos swap_thing (var->ctv_name);
1026 1.1 christos swap_thing (var->ctv_type);
1027 1.1 christos }
1028 1.1 christos }
1029 1.1 christos
1030 1.1 christos /* Flip the endianness of the type section, a tagged array of ctf_type or
1031 1.1 christos ctf_stype followed by variable data. */
1032 1.1 christos
1033 1.1 christos static int
1034 1.1.1.1.2.1 perseant flip_types (ctf_dict_t *fp, void *start, size_t len, int to_foreign)
1035 1.1 christos {
1036 1.1 christos ctf_type_t *t = start;
1037 1.1 christos
1038 1.1 christos while ((uintptr_t) t < ((uintptr_t) start) + len)
1039 1.1 christos {
1040 1.1.1.1.2.1 perseant uint32_t kind;
1041 1.1.1.1.2.1 perseant size_t size;
1042 1.1.1.1.2.1 perseant uint32_t vlen;
1043 1.1.1.1.2.1 perseant size_t vbytes;
1044 1.1.1.1.2.1 perseant
1045 1.1.1.1.2.1 perseant if (to_foreign)
1046 1.1.1.1.2.1 perseant {
1047 1.1.1.1.2.1 perseant kind = CTF_V2_INFO_KIND (t->ctt_info);
1048 1.1.1.1.2.1 perseant size = t->ctt_size;
1049 1.1.1.1.2.1 perseant vlen = CTF_V2_INFO_VLEN (t->ctt_info);
1050 1.1.1.1.2.1 perseant vbytes = get_vbytes_v2 (fp, kind, size, vlen);
1051 1.1.1.1.2.1 perseant }
1052 1.1.1.1.2.1 perseant
1053 1.1 christos swap_thing (t->ctt_name);
1054 1.1 christos swap_thing (t->ctt_info);
1055 1.1 christos swap_thing (t->ctt_size);
1056 1.1 christos
1057 1.1.1.1.2.1 perseant if (!to_foreign)
1058 1.1.1.1.2.1 perseant {
1059 1.1.1.1.2.1 perseant kind = CTF_V2_INFO_KIND (t->ctt_info);
1060 1.1.1.1.2.1 perseant size = t->ctt_size;
1061 1.1.1.1.2.1 perseant vlen = CTF_V2_INFO_VLEN (t->ctt_info);
1062 1.1.1.1.2.1 perseant vbytes = get_vbytes_v2 (fp, kind, size, vlen);
1063 1.1.1.1.2.1 perseant }
1064 1.1 christos
1065 1.1 christos if (_libctf_unlikely_ (size == CTF_LSIZE_SENT))
1066 1.1 christos {
1067 1.1.1.1.2.1 perseant if (to_foreign)
1068 1.1.1.1.2.1 perseant size = CTF_TYPE_LSIZE (t);
1069 1.1.1.1.2.1 perseant
1070 1.1 christos swap_thing (t->ctt_lsizehi);
1071 1.1 christos swap_thing (t->ctt_lsizelo);
1072 1.1.1.1.2.1 perseant
1073 1.1.1.1.2.1 perseant if (!to_foreign)
1074 1.1.1.1.2.1 perseant size = CTF_TYPE_LSIZE (t);
1075 1.1.1.1.2.1 perseant
1076 1.1 christos t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_type_t));
1077 1.1 christos }
1078 1.1 christos else
1079 1.1 christos t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_stype_t));
1080 1.1 christos
1081 1.1 christos switch (kind)
1082 1.1 christos {
1083 1.1 christos case CTF_K_FORWARD:
1084 1.1 christos case CTF_K_UNKNOWN:
1085 1.1 christos case CTF_K_POINTER:
1086 1.1 christos case CTF_K_TYPEDEF:
1087 1.1 christos case CTF_K_VOLATILE:
1088 1.1 christos case CTF_K_CONST:
1089 1.1 christos case CTF_K_RESTRICT:
1090 1.1 christos /* These types have no vlen data to swap. */
1091 1.1 christos assert (vbytes == 0);
1092 1.1 christos break;
1093 1.1 christos
1094 1.1 christos case CTF_K_INTEGER:
1095 1.1 christos case CTF_K_FLOAT:
1096 1.1 christos {
1097 1.1 christos /* These types have a single uint32_t. */
1098 1.1 christos
1099 1.1 christos uint32_t *item = (uint32_t *) t;
1100 1.1 christos
1101 1.1 christos swap_thing (*item);
1102 1.1 christos break;
1103 1.1 christos }
1104 1.1 christos
1105 1.1 christos case CTF_K_FUNCTION:
1106 1.1 christos {
1107 1.1 christos /* This type has a bunch of uint32_ts. */
1108 1.1 christos
1109 1.1 christos uint32_t *item = (uint32_t *) t;
1110 1.1 christos ssize_t i;
1111 1.1 christos
1112 1.1 christos for (i = vlen; i > 0; item++, i--)
1113 1.1 christos swap_thing (*item);
1114 1.1 christos break;
1115 1.1 christos }
1116 1.1 christos
1117 1.1 christos case CTF_K_ARRAY:
1118 1.1 christos {
1119 1.1 christos /* This has a single ctf_array_t. */
1120 1.1 christos
1121 1.1 christos ctf_array_t *a = (ctf_array_t *) t;
1122 1.1 christos
1123 1.1 christos assert (vbytes == sizeof (ctf_array_t));
1124 1.1 christos swap_thing (a->cta_contents);
1125 1.1 christos swap_thing (a->cta_index);
1126 1.1 christos swap_thing (a->cta_nelems);
1127 1.1 christos
1128 1.1 christos break;
1129 1.1 christos }
1130 1.1 christos
1131 1.1 christos case CTF_K_SLICE:
1132 1.1 christos {
1133 1.1 christos /* This has a single ctf_slice_t. */
1134 1.1 christos
1135 1.1 christos ctf_slice_t *s = (ctf_slice_t *) t;
1136 1.1 christos
1137 1.1 christos assert (vbytes == sizeof (ctf_slice_t));
1138 1.1 christos swap_thing (s->cts_type);
1139 1.1 christos swap_thing (s->cts_offset);
1140 1.1 christos swap_thing (s->cts_bits);
1141 1.1 christos
1142 1.1 christos break;
1143 1.1 christos }
1144 1.1 christos
1145 1.1 christos case CTF_K_STRUCT:
1146 1.1 christos case CTF_K_UNION:
1147 1.1 christos {
1148 1.1 christos /* This has an array of ctf_member or ctf_lmember, depending on
1149 1.1 christos size. We could consider it to be a simple array of uint32_t,
1150 1.1 christos but for safety's sake in case these structures ever acquire
1151 1.1 christos non-uint32_t members, do it member by member. */
1152 1.1 christos
1153 1.1 christos if (_libctf_unlikely_ (size >= CTF_LSTRUCT_THRESH))
1154 1.1 christos {
1155 1.1 christos ctf_lmember_t *lm = (ctf_lmember_t *) t;
1156 1.1 christos ssize_t i;
1157 1.1 christos for (i = vlen; i > 0; i--, lm++)
1158 1.1 christos {
1159 1.1 christos swap_thing (lm->ctlm_name);
1160 1.1 christos swap_thing (lm->ctlm_offsethi);
1161 1.1 christos swap_thing (lm->ctlm_type);
1162 1.1 christos swap_thing (lm->ctlm_offsetlo);
1163 1.1 christos }
1164 1.1 christos }
1165 1.1 christos else
1166 1.1 christos {
1167 1.1 christos ctf_member_t *m = (ctf_member_t *) t;
1168 1.1 christos ssize_t i;
1169 1.1 christos for (i = vlen; i > 0; i--, m++)
1170 1.1 christos {
1171 1.1 christos swap_thing (m->ctm_name);
1172 1.1 christos swap_thing (m->ctm_offset);
1173 1.1 christos swap_thing (m->ctm_type);
1174 1.1 christos }
1175 1.1 christos }
1176 1.1 christos break;
1177 1.1 christos }
1178 1.1 christos
1179 1.1 christos case CTF_K_ENUM:
1180 1.1 christos {
1181 1.1 christos /* This has an array of ctf_enum_t. */
1182 1.1 christos
1183 1.1 christos ctf_enum_t *item = (ctf_enum_t *) t;
1184 1.1 christos ssize_t i;
1185 1.1 christos
1186 1.1 christos for (i = vlen; i > 0; item++, i--)
1187 1.1 christos {
1188 1.1 christos swap_thing (item->cte_name);
1189 1.1 christos swap_thing (item->cte_value);
1190 1.1 christos }
1191 1.1 christos break;
1192 1.1 christos }
1193 1.1 christos default:
1194 1.1 christos ctf_err_warn (fp, 0, ECTF_CORRUPT,
1195 1.1 christos _("unhandled CTF kind in endianness conversion: %x"),
1196 1.1 christos kind);
1197 1.1 christos return ECTF_CORRUPT;
1198 1.1 christos }
1199 1.1 christos
1200 1.1 christos t = (ctf_type_t *) ((uintptr_t) t + vbytes);
1201 1.1 christos }
1202 1.1 christos
1203 1.1 christos return 0;
1204 1.1 christos }
1205 1.1 christos
1206 1.1 christos /* Flip the endianness of BUF, given the offsets in the (already endian-
1207 1.1.1.1.2.1 perseant converted) CTH. If TO_FOREIGN is set, flip to foreign-endianness; if not,
1208 1.1.1.1.2.1 perseant flip away.
1209 1.1 christos
1210 1.1 christos All of this stuff happens before the header is fully initialized, so the
1211 1.1 christos LCTF_*() macros cannot be used yet. Since we do not try to endian-convert v1
1212 1.1 christos data, this is no real loss. */
1213 1.1 christos
1214 1.1.1.1.2.1 perseant int
1215 1.1.1.1.2.1 perseant ctf_flip (ctf_dict_t *fp, ctf_header_t *cth, unsigned char *buf,
1216 1.1.1.1.2.1 perseant int to_foreign)
1217 1.1 christos {
1218 1.1.1.1.2.1 perseant ctf_dprintf("flipping endianness\n");
1219 1.1.1.1.2.1 perseant
1220 1.1 christos flip_lbls (buf + cth->cth_lbloff, cth->cth_objtoff - cth->cth_lbloff);
1221 1.1 christos flip_objts (buf + cth->cth_objtoff, cth->cth_funcoff - cth->cth_objtoff);
1222 1.1 christos flip_objts (buf + cth->cth_funcoff, cth->cth_objtidxoff - cth->cth_funcoff);
1223 1.1 christos flip_objts (buf + cth->cth_objtidxoff, cth->cth_funcidxoff - cth->cth_objtidxoff);
1224 1.1 christos flip_objts (buf + cth->cth_funcidxoff, cth->cth_varoff - cth->cth_funcidxoff);
1225 1.1 christos flip_vars (buf + cth->cth_varoff, cth->cth_typeoff - cth->cth_varoff);
1226 1.1.1.1.2.1 perseant return flip_types (fp, buf + cth->cth_typeoff,
1227 1.1.1.1.2.1 perseant cth->cth_stroff - cth->cth_typeoff, to_foreign);
1228 1.1 christos }
1229 1.1 christos
1230 1.1.1.1.2.1 perseant /* Set up the ctl hashes in a ctf_dict_t. Called by both writable and
1231 1.1 christos non-writable dictionary initialization. */
1232 1.1.1.1.2.1 perseant void ctf_set_ctl_hashes (ctf_dict_t *fp)
1233 1.1 christos {
1234 1.1 christos /* Initialize the ctf_lookup_by_name top-level dictionary. We keep an
1235 1.1 christos array of type name prefixes and the corresponding ctf_hash to use. */
1236 1.1 christos fp->ctf_lookups[0].ctl_prefix = "struct";
1237 1.1 christos fp->ctf_lookups[0].ctl_len = strlen (fp->ctf_lookups[0].ctl_prefix);
1238 1.1 christos fp->ctf_lookups[0].ctl_hash = &fp->ctf_structs;
1239 1.1 christos fp->ctf_lookups[1].ctl_prefix = "union";
1240 1.1 christos fp->ctf_lookups[1].ctl_len = strlen (fp->ctf_lookups[1].ctl_prefix);
1241 1.1 christos fp->ctf_lookups[1].ctl_hash = &fp->ctf_unions;
1242 1.1 christos fp->ctf_lookups[2].ctl_prefix = "enum";
1243 1.1 christos fp->ctf_lookups[2].ctl_len = strlen (fp->ctf_lookups[2].ctl_prefix);
1244 1.1 christos fp->ctf_lookups[2].ctl_hash = &fp->ctf_enums;
1245 1.1 christos fp->ctf_lookups[3].ctl_prefix = _CTF_NULLSTR;
1246 1.1 christos fp->ctf_lookups[3].ctl_len = strlen (fp->ctf_lookups[3].ctl_prefix);
1247 1.1 christos fp->ctf_lookups[3].ctl_hash = &fp->ctf_names;
1248 1.1 christos fp->ctf_lookups[4].ctl_prefix = NULL;
1249 1.1 christos fp->ctf_lookups[4].ctl_len = 0;
1250 1.1 christos fp->ctf_lookups[4].ctl_hash = NULL;
1251 1.1 christos }
1252 1.1 christos
1253 1.1 christos /* Open a CTF file, mocking up a suitable ctf_sect. */
1254 1.1 christos
1255 1.1.1.1.2.1 perseant ctf_dict_t *ctf_simple_open (const char *ctfsect, size_t ctfsect_size,
1256 1.1 christos const char *symsect, size_t symsect_size,
1257 1.1 christos size_t symsect_entsize,
1258 1.1 christos const char *strsect, size_t strsect_size,
1259 1.1 christos int *errp)
1260 1.1 christos {
1261 1.1 christos return ctf_simple_open_internal (ctfsect, ctfsect_size, symsect, symsect_size,
1262 1.1 christos symsect_entsize, strsect, strsect_size, NULL,
1263 1.1 christos 0, errp);
1264 1.1 christos }
1265 1.1 christos
1266 1.1 christos /* Open a CTF file, mocking up a suitable ctf_sect and overriding the external
1267 1.1 christos strtab with a synthetic one. */
1268 1.1 christos
1269 1.1.1.1.2.1 perseant ctf_dict_t *ctf_simple_open_internal (const char *ctfsect, size_t ctfsect_size,
1270 1.1 christos const char *symsect, size_t symsect_size,
1271 1.1 christos size_t symsect_entsize,
1272 1.1 christos const char *strsect, size_t strsect_size,
1273 1.1 christos ctf_dynhash_t *syn_strtab, int writable,
1274 1.1 christos int *errp)
1275 1.1 christos {
1276 1.1 christos ctf_sect_t skeleton;
1277 1.1 christos
1278 1.1 christos ctf_sect_t ctf_sect, sym_sect, str_sect;
1279 1.1 christos ctf_sect_t *ctfsectp = NULL;
1280 1.1 christos ctf_sect_t *symsectp = NULL;
1281 1.1 christos ctf_sect_t *strsectp = NULL;
1282 1.1 christos
1283 1.1 christos skeleton.cts_name = _CTF_SECTION;
1284 1.1 christos skeleton.cts_entsize = 1;
1285 1.1 christos
1286 1.1 christos if (ctfsect)
1287 1.1 christos {
1288 1.1 christos memcpy (&ctf_sect, &skeleton, sizeof (struct ctf_sect));
1289 1.1 christos ctf_sect.cts_data = ctfsect;
1290 1.1 christos ctf_sect.cts_size = ctfsect_size;
1291 1.1 christos ctfsectp = &ctf_sect;
1292 1.1 christos }
1293 1.1 christos
1294 1.1 christos if (symsect)
1295 1.1 christos {
1296 1.1 christos memcpy (&sym_sect, &skeleton, sizeof (struct ctf_sect));
1297 1.1 christos sym_sect.cts_data = symsect;
1298 1.1 christos sym_sect.cts_size = symsect_size;
1299 1.1 christos sym_sect.cts_entsize = symsect_entsize;
1300 1.1 christos symsectp = &sym_sect;
1301 1.1 christos }
1302 1.1 christos
1303 1.1 christos if (strsect)
1304 1.1 christos {
1305 1.1 christos memcpy (&str_sect, &skeleton, sizeof (struct ctf_sect));
1306 1.1 christos str_sect.cts_data = strsect;
1307 1.1 christos str_sect.cts_size = strsect_size;
1308 1.1 christos strsectp = &str_sect;
1309 1.1 christos }
1310 1.1 christos
1311 1.1 christos return ctf_bufopen_internal (ctfsectp, symsectp, strsectp, syn_strtab,
1312 1.1 christos writable, errp);
1313 1.1 christos }
1314 1.1 christos
1315 1.1 christos /* Decode the specified CTF buffer and optional symbol table, and create a new
1316 1.1.1.1.2.1 perseant CTF dict representing the symbolic debugging information. This code can
1317 1.1 christos be used directly by the debugger, or it can be used as the engine for
1318 1.1 christos ctf_fdopen() or ctf_open(), below. */
1319 1.1 christos
1320 1.1.1.1.2.1 perseant ctf_dict_t *
1321 1.1 christos ctf_bufopen (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
1322 1.1 christos const ctf_sect_t *strsect, int *errp)
1323 1.1 christos {
1324 1.1 christos return ctf_bufopen_internal (ctfsect, symsect, strsect, NULL, 0, errp);
1325 1.1 christos }
1326 1.1 christos
1327 1.1 christos /* Like ctf_bufopen, but overriding the external strtab with a synthetic one. */
1328 1.1 christos
1329 1.1.1.1.2.1 perseant ctf_dict_t *
1330 1.1 christos ctf_bufopen_internal (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
1331 1.1 christos const ctf_sect_t *strsect, ctf_dynhash_t *syn_strtab,
1332 1.1 christos int writable, int *errp)
1333 1.1 christos {
1334 1.1 christos const ctf_preamble_t *pp;
1335 1.1 christos size_t hdrsz = sizeof (ctf_header_t);
1336 1.1 christos ctf_header_t *hp;
1337 1.1.1.1.2.1 perseant ctf_dict_t *fp;
1338 1.1 christos int foreign_endian = 0;
1339 1.1 christos int err;
1340 1.1 christos
1341 1.1 christos libctf_init_debug();
1342 1.1 christos
1343 1.1 christos if ((ctfsect == NULL) || ((symsect != NULL) &&
1344 1.1 christos ((strsect == NULL) && syn_strtab == NULL)))
1345 1.1 christos return (ctf_set_open_errno (errp, EINVAL));
1346 1.1 christos
1347 1.1 christos if (symsect != NULL && symsect->cts_entsize != sizeof (Elf32_Sym) &&
1348 1.1 christos symsect->cts_entsize != sizeof (Elf64_Sym))
1349 1.1 christos return (ctf_set_open_errno (errp, ECTF_SYMTAB));
1350 1.1 christos
1351 1.1 christos if (symsect != NULL && symsect->cts_data == NULL)
1352 1.1 christos return (ctf_set_open_errno (errp, ECTF_SYMBAD));
1353 1.1 christos
1354 1.1 christos if (strsect != NULL && strsect->cts_data == NULL)
1355 1.1 christos return (ctf_set_open_errno (errp, ECTF_STRBAD));
1356 1.1 christos
1357 1.1 christos if (ctfsect->cts_size < sizeof (ctf_preamble_t))
1358 1.1 christos return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1359 1.1 christos
1360 1.1 christos pp = (const ctf_preamble_t *) ctfsect->cts_data;
1361 1.1 christos
1362 1.1 christos ctf_dprintf ("ctf_bufopen: magic=0x%x version=%u\n",
1363 1.1 christos pp->ctp_magic, pp->ctp_version);
1364 1.1 christos
1365 1.1 christos /* Validate each part of the CTF header.
1366 1.1 christos
1367 1.1 christos First, we validate the preamble (common to all versions). At that point,
1368 1.1 christos we know the endianness and specific header version, and can validate the
1369 1.1 christos version-specific parts including section offsets and alignments.
1370 1.1 christos
1371 1.1 christos We specifically do not support foreign-endian old versions. */
1372 1.1 christos
1373 1.1 christos if (_libctf_unlikely_ (pp->ctp_magic != CTF_MAGIC))
1374 1.1 christos {
1375 1.1 christos if (pp->ctp_magic == bswap_16 (CTF_MAGIC))
1376 1.1 christos {
1377 1.1 christos if (pp->ctp_version != CTF_VERSION_3)
1378 1.1 christos return (ctf_set_open_errno (errp, ECTF_CTFVERS));
1379 1.1 christos foreign_endian = 1;
1380 1.1 christos }
1381 1.1 christos else
1382 1.1 christos return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1383 1.1 christos }
1384 1.1 christos
1385 1.1 christos if (_libctf_unlikely_ ((pp->ctp_version < CTF_VERSION_1)
1386 1.1 christos || (pp->ctp_version > CTF_VERSION_3)))
1387 1.1 christos return (ctf_set_open_errno (errp, ECTF_CTFVERS));
1388 1.1 christos
1389 1.1 christos if ((symsect != NULL) && (pp->ctp_version < CTF_VERSION_2))
1390 1.1 christos {
1391 1.1 christos /* The symtab can contain function entries which contain embedded ctf
1392 1.1 christos info. We do not support dynamically upgrading such entries (none
1393 1.1 christos should exist in any case, since dwarf2ctf does not create them). */
1394 1.1 christos
1395 1.1.1.1.2.1 perseant ctf_err_warn (NULL, 0, ECTF_NOTSUP, _("ctf_bufopen: CTF version %d "
1396 1.1.1.1.2.1 perseant "symsect not supported"),
1397 1.1.1.1.2.1 perseant pp->ctp_version);
1398 1.1 christos return (ctf_set_open_errno (errp, ECTF_NOTSUP));
1399 1.1 christos }
1400 1.1 christos
1401 1.1 christos if (pp->ctp_version < CTF_VERSION_3)
1402 1.1 christos hdrsz = sizeof (ctf_header_v2_t);
1403 1.1 christos
1404 1.1 christos if (_libctf_unlikely_ (pp->ctp_flags > CTF_F_MAX))
1405 1.1.1.1.2.1 perseant {
1406 1.1.1.1.2.1 perseant ctf_err_warn (NULL, 0, ECTF_FLAGS, _("ctf_bufopen: invalid header "
1407 1.1.1.1.2.1 perseant "flags: %x"),
1408 1.1.1.1.2.1 perseant (unsigned int) pp->ctp_flags);
1409 1.1.1.1.2.1 perseant return (ctf_set_open_errno (errp, ECTF_FLAGS));
1410 1.1.1.1.2.1 perseant }
1411 1.1 christos
1412 1.1 christos if (ctfsect->cts_size < hdrsz)
1413 1.1 christos return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1414 1.1 christos
1415 1.1.1.1.2.1 perseant if ((fp = malloc (sizeof (ctf_dict_t))) == NULL)
1416 1.1 christos return (ctf_set_open_errno (errp, ENOMEM));
1417 1.1 christos
1418 1.1.1.1.2.1 perseant memset (fp, 0, sizeof (ctf_dict_t));
1419 1.1 christos
1420 1.1 christos if (writable)
1421 1.1 christos fp->ctf_flags |= LCTF_RDWR;
1422 1.1 christos
1423 1.1 christos if ((fp->ctf_header = malloc (sizeof (struct ctf_header))) == NULL)
1424 1.1 christos {
1425 1.1 christos free (fp);
1426 1.1 christos return (ctf_set_open_errno (errp, ENOMEM));
1427 1.1 christos }
1428 1.1 christos hp = fp->ctf_header;
1429 1.1 christos memcpy (hp, ctfsect->cts_data, hdrsz);
1430 1.1 christos if (pp->ctp_version < CTF_VERSION_3)
1431 1.1 christos upgrade_header (hp);
1432 1.1 christos
1433 1.1 christos if (foreign_endian)
1434 1.1.1.1.2.1 perseant ctf_flip_header (hp);
1435 1.1 christos fp->ctf_openflags = hp->cth_flags;
1436 1.1 christos fp->ctf_size = hp->cth_stroff + hp->cth_strlen;
1437 1.1 christos
1438 1.1 christos ctf_dprintf ("ctf_bufopen: uncompressed size=%lu\n",
1439 1.1 christos (unsigned long) fp->ctf_size);
1440 1.1 christos
1441 1.1 christos if (hp->cth_lbloff > fp->ctf_size || hp->cth_objtoff > fp->ctf_size
1442 1.1 christos || hp->cth_funcoff > fp->ctf_size || hp->cth_objtidxoff > fp->ctf_size
1443 1.1 christos || hp->cth_funcidxoff > fp->ctf_size || hp->cth_typeoff > fp->ctf_size
1444 1.1 christos || hp->cth_stroff > fp->ctf_size)
1445 1.1.1.1.2.1 perseant {
1446 1.1.1.1.2.1 perseant ctf_err_warn (NULL, 0, ECTF_CORRUPT, _("header offset exceeds CTF size"));
1447 1.1.1.1.2.1 perseant return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1448 1.1.1.1.2.1 perseant }
1449 1.1 christos
1450 1.1 christos if (hp->cth_lbloff > hp->cth_objtoff
1451 1.1 christos || hp->cth_objtoff > hp->cth_funcoff
1452 1.1 christos || hp->cth_funcoff > hp->cth_typeoff
1453 1.1 christos || hp->cth_funcoff > hp->cth_objtidxoff
1454 1.1 christos || hp->cth_objtidxoff > hp->cth_funcidxoff
1455 1.1 christos || hp->cth_funcidxoff > hp->cth_varoff
1456 1.1 christos || hp->cth_varoff > hp->cth_typeoff || hp->cth_typeoff > hp->cth_stroff)
1457 1.1.1.1.2.1 perseant {
1458 1.1.1.1.2.1 perseant ctf_err_warn (NULL, 0, ECTF_CORRUPT, _("overlapping CTF sections"));
1459 1.1.1.1.2.1 perseant return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1460 1.1.1.1.2.1 perseant }
1461 1.1 christos
1462 1.1 christos if ((hp->cth_lbloff & 3) || (hp->cth_objtoff & 2)
1463 1.1 christos || (hp->cth_funcoff & 2) || (hp->cth_objtidxoff & 2)
1464 1.1 christos || (hp->cth_funcidxoff & 2) || (hp->cth_varoff & 3)
1465 1.1 christos || (hp->cth_typeoff & 3))
1466 1.1.1.1.2.1 perseant {
1467 1.1.1.1.2.1 perseant ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1468 1.1.1.1.2.1 perseant _("CTF sections not properly aligned"));
1469 1.1.1.1.2.1 perseant return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1470 1.1.1.1.2.1 perseant }
1471 1.1.1.1.2.1 perseant
1472 1.1.1.1.2.1 perseant /* This invariant will be lifted in v4, but for now it is true. */
1473 1.1.1.1.2.1 perseant
1474 1.1.1.1.2.1 perseant if ((hp->cth_funcidxoff - hp->cth_objtidxoff != 0) &&
1475 1.1.1.1.2.1 perseant (hp->cth_funcidxoff - hp->cth_objtidxoff
1476 1.1.1.1.2.1 perseant != hp->cth_funcoff - hp->cth_objtoff))
1477 1.1.1.1.2.1 perseant {
1478 1.1.1.1.2.1 perseant ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1479 1.1.1.1.2.1 perseant _("Object index section is neither empty nor the "
1480 1.1.1.1.2.1 perseant "same length as the object section: %u versus %u "
1481 1.1.1.1.2.1 perseant "bytes"), hp->cth_funcoff - hp->cth_objtoff,
1482 1.1.1.1.2.1 perseant hp->cth_funcidxoff - hp->cth_objtidxoff);
1483 1.1.1.1.2.1 perseant return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1484 1.1.1.1.2.1 perseant }
1485 1.1.1.1.2.1 perseant
1486 1.1.1.1.2.1 perseant if ((hp->cth_varoff - hp->cth_funcidxoff != 0) &&
1487 1.1.1.1.2.1 perseant (hp->cth_varoff - hp->cth_funcidxoff
1488 1.1.1.1.2.1 perseant != hp->cth_objtidxoff - hp->cth_funcoff) &&
1489 1.1.1.1.2.1 perseant (hp->cth_flags & CTF_F_NEWFUNCINFO))
1490 1.1.1.1.2.1 perseant {
1491 1.1.1.1.2.1 perseant ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1492 1.1.1.1.2.1 perseant _("Function index section is neither empty nor the "
1493 1.1.1.1.2.1 perseant "same length as the function section: %u versus %u "
1494 1.1.1.1.2.1 perseant "bytes"), hp->cth_objtidxoff - hp->cth_funcoff,
1495 1.1.1.1.2.1 perseant hp->cth_varoff - hp->cth_funcidxoff);
1496 1.1.1.1.2.1 perseant return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1497 1.1.1.1.2.1 perseant }
1498 1.1 christos
1499 1.1 christos /* Once everything is determined to be valid, attempt to decompress the CTF
1500 1.1 christos data buffer if it is compressed, or copy it into new storage if it is not
1501 1.1 christos compressed but needs endian-flipping. Otherwise we just put the data
1502 1.1 christos section's buffer pointer into ctf_buf, below. */
1503 1.1 christos
1504 1.1 christos /* Note: if this is a v1 buffer, it will be reallocated and expanded by
1505 1.1 christos init_types(). */
1506 1.1 christos
1507 1.1 christos if (hp->cth_flags & CTF_F_COMPRESS)
1508 1.1 christos {
1509 1.1 christos size_t srclen;
1510 1.1 christos uLongf dstlen;
1511 1.1 christos const void *src;
1512 1.1 christos int rc = Z_OK;
1513 1.1 christos
1514 1.1 christos /* We are allocating this ourselves, so we can drop the ctf header
1515 1.1 christos copy in favour of ctf->ctf_header. */
1516 1.1 christos
1517 1.1 christos if ((fp->ctf_base = malloc (fp->ctf_size)) == NULL)
1518 1.1 christos {
1519 1.1 christos err = ECTF_ZALLOC;
1520 1.1 christos goto bad;
1521 1.1 christos }
1522 1.1 christos fp->ctf_dynbase = fp->ctf_base;
1523 1.1 christos hp->cth_flags &= ~CTF_F_COMPRESS;
1524 1.1 christos
1525 1.1 christos src = (unsigned char *) ctfsect->cts_data + hdrsz;
1526 1.1 christos srclen = ctfsect->cts_size - hdrsz;
1527 1.1 christos dstlen = fp->ctf_size;
1528 1.1 christos fp->ctf_buf = fp->ctf_base;
1529 1.1 christos
1530 1.1 christos if ((rc = uncompress (fp->ctf_base, &dstlen, src, srclen)) != Z_OK)
1531 1.1 christos {
1532 1.1 christos ctf_err_warn (NULL, 0, ECTF_DECOMPRESS, _("zlib inflate err: %s"),
1533 1.1 christos zError (rc));
1534 1.1 christos err = ECTF_DECOMPRESS;
1535 1.1 christos goto bad;
1536 1.1 christos }
1537 1.1 christos
1538 1.1 christos if ((size_t) dstlen != fp->ctf_size)
1539 1.1 christos {
1540 1.1 christos ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1541 1.1 christos _("zlib inflate short: got %lu of %lu bytes"),
1542 1.1 christos (unsigned long) dstlen, (unsigned long) fp->ctf_size);
1543 1.1 christos err = ECTF_CORRUPT;
1544 1.1 christos goto bad;
1545 1.1 christos }
1546 1.1 christos }
1547 1.1.1.1.2.1 perseant else
1548 1.1 christos {
1549 1.1.1.1.2.1 perseant if (_libctf_unlikely_ (ctfsect->cts_size < hdrsz + fp->ctf_size))
1550 1.1 christos {
1551 1.1.1.1.2.1 perseant ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1552 1.1.1.1.2.1 perseant _("%lu byte long CTF dictionary overruns %lu byte long CTF section"),
1553 1.1.1.1.2.1 perseant (unsigned long) ctfsect->cts_size,
1554 1.1.1.1.2.1 perseant (unsigned long) (hdrsz + fp->ctf_size));
1555 1.1.1.1.2.1 perseant err = ECTF_CORRUPT;
1556 1.1 christos goto bad;
1557 1.1 christos }
1558 1.1.1.1.2.1 perseant
1559 1.1.1.1.2.1 perseant if (foreign_endian)
1560 1.1.1.1.2.1 perseant {
1561 1.1.1.1.2.1 perseant if ((fp->ctf_base = malloc (fp->ctf_size)) == NULL)
1562 1.1.1.1.2.1 perseant {
1563 1.1.1.1.2.1 perseant err = ECTF_ZALLOC;
1564 1.1.1.1.2.1 perseant goto bad;
1565 1.1.1.1.2.1 perseant }
1566 1.1.1.1.2.1 perseant fp->ctf_dynbase = fp->ctf_base;
1567 1.1.1.1.2.1 perseant memcpy (fp->ctf_base, ((unsigned char *) ctfsect->cts_data) + hdrsz,
1568 1.1.1.1.2.1 perseant fp->ctf_size);
1569 1.1.1.1.2.1 perseant fp->ctf_buf = fp->ctf_base;
1570 1.1.1.1.2.1 perseant }
1571 1.1.1.1.2.1 perseant else
1572 1.1.1.1.2.1 perseant {
1573 1.1.1.1.2.1 perseant /* We are just using the section passed in -- but its header may
1574 1.1.1.1.2.1 perseant be an old version. Point ctf_buf past the old header, and
1575 1.1.1.1.2.1 perseant never touch it again. */
1576 1.1.1.1.2.1 perseant fp->ctf_base = (unsigned char *) ctfsect->cts_data;
1577 1.1.1.1.2.1 perseant fp->ctf_dynbase = NULL;
1578 1.1.1.1.2.1 perseant fp->ctf_buf = fp->ctf_base + hdrsz;
1579 1.1.1.1.2.1 perseant }
1580 1.1 christos }
1581 1.1 christos
1582 1.1 christos /* Once we have uncompressed and validated the CTF data buffer, we can
1583 1.1.1.1.2.1 perseant proceed with initializing the ctf_dict_t we allocated above.
1584 1.1 christos
1585 1.1 christos Nothing that depends on buf or base should be set directly in this function
1586 1.1 christos before the init_types() call, because it may be reallocated during
1587 1.1 christos transparent upgrade if this recension of libctf is so configured: see
1588 1.1 christos ctf_set_base(). */
1589 1.1 christos
1590 1.1 christos ctf_set_version (fp, hp, hp->cth_version);
1591 1.1.1.1.2.1 perseant if (ctf_str_create_atoms (fp) < 0)
1592 1.1.1.1.2.1 perseant {
1593 1.1.1.1.2.1 perseant err = ENOMEM;
1594 1.1.1.1.2.1 perseant goto bad;
1595 1.1.1.1.2.1 perseant }
1596 1.1.1.1.2.1 perseant
1597 1.1 christos fp->ctf_parmax = CTF_MAX_PTYPE;
1598 1.1 christos memcpy (&fp->ctf_data, ctfsect, sizeof (ctf_sect_t));
1599 1.1 christos
1600 1.1 christos if (symsect != NULL)
1601 1.1 christos {
1602 1.1 christos memcpy (&fp->ctf_symtab, symsect, sizeof (ctf_sect_t));
1603 1.1 christos memcpy (&fp->ctf_strtab, strsect, sizeof (ctf_sect_t));
1604 1.1 christos }
1605 1.1 christos
1606 1.1 christos if (fp->ctf_data.cts_name != NULL)
1607 1.1 christos if ((fp->ctf_data.cts_name = strdup (fp->ctf_data.cts_name)) == NULL)
1608 1.1 christos {
1609 1.1 christos err = ENOMEM;
1610 1.1 christos goto bad;
1611 1.1 christos }
1612 1.1 christos if (fp->ctf_symtab.cts_name != NULL)
1613 1.1 christos if ((fp->ctf_symtab.cts_name = strdup (fp->ctf_symtab.cts_name)) == NULL)
1614 1.1 christos {
1615 1.1 christos err = ENOMEM;
1616 1.1 christos goto bad;
1617 1.1 christos }
1618 1.1 christos if (fp->ctf_strtab.cts_name != NULL)
1619 1.1 christos if ((fp->ctf_strtab.cts_name = strdup (fp->ctf_strtab.cts_name)) == NULL)
1620 1.1 christos {
1621 1.1 christos err = ENOMEM;
1622 1.1 christos goto bad;
1623 1.1 christos }
1624 1.1 christos
1625 1.1 christos if (fp->ctf_data.cts_name == NULL)
1626 1.1 christos fp->ctf_data.cts_name = _CTF_NULLSTR;
1627 1.1 christos if (fp->ctf_symtab.cts_name == NULL)
1628 1.1 christos fp->ctf_symtab.cts_name = _CTF_NULLSTR;
1629 1.1 christos if (fp->ctf_strtab.cts_name == NULL)
1630 1.1 christos fp->ctf_strtab.cts_name = _CTF_NULLSTR;
1631 1.1 christos
1632 1.1 christos if (strsect != NULL)
1633 1.1 christos {
1634 1.1 christos fp->ctf_str[CTF_STRTAB_1].cts_strs = strsect->cts_data;
1635 1.1 christos fp->ctf_str[CTF_STRTAB_1].cts_len = strsect->cts_size;
1636 1.1 christos }
1637 1.1 christos fp->ctf_syn_ext_strtab = syn_strtab;
1638 1.1 christos
1639 1.1 christos if (foreign_endian &&
1640 1.1.1.1.2.1 perseant (err = ctf_flip (fp, hp, fp->ctf_buf, 0)) != 0)
1641 1.1 christos {
1642 1.1.1.1.2.1 perseant /* We can be certain that ctf_flip() will have endian-flipped everything
1643 1.1 christos other than the types table when we return. In particular the header
1644 1.1 christos is fine, so set it, to allow freeing to use the usual code path. */
1645 1.1 christos
1646 1.1 christos ctf_set_base (fp, hp, fp->ctf_base);
1647 1.1 christos goto bad;
1648 1.1 christos }
1649 1.1 christos
1650 1.1 christos ctf_set_base (fp, hp, fp->ctf_base);
1651 1.1 christos
1652 1.1.1.1.2.1 perseant /* No need to do anything else for dynamic dicts: they do not support symbol
1653 1.1.1.1.2.1 perseant lookups, and the type table is maintained in the dthashes. */
1654 1.1 christos if (fp->ctf_flags & LCTF_RDWR)
1655 1.1 christos {
1656 1.1 christos fp->ctf_refcnt = 1;
1657 1.1 christos return fp;
1658 1.1 christos }
1659 1.1 christos
1660 1.1 christos if ((err = init_types (fp, hp)) != 0)
1661 1.1 christos goto bad;
1662 1.1 christos
1663 1.1.1.1.2.1 perseant /* Allocate and initialize the symtab translation table, pointed to by
1664 1.1.1.1.2.1 perseant ctf_sxlate, and the corresponding index sections. This table may be too
1665 1.1.1.1.2.1 perseant large for the actual size of the object and function info sections: if so,
1666 1.1.1.1.2.1 perseant ctf_nsyms will be adjusted and the excess will never be used. It's
1667 1.1.1.1.2.1 perseant possible to do indexed symbol lookups even without a symbol table, so check
1668 1.1.1.1.2.1 perseant even in that case. Initially, we assume the symtab is native-endian: if it
1669 1.1.1.1.2.1 perseant isn't, the caller will inform us later by calling ctf_symsect_endianness. */
1670 1.1.1.1.2.1 perseant #ifdef WORDS_BIGENDIAN
1671 1.1.1.1.2.1 perseant fp->ctf_symsect_little_endian = 0;
1672 1.1.1.1.2.1 perseant #else
1673 1.1.1.1.2.1 perseant fp->ctf_symsect_little_endian = 1;
1674 1.1.1.1.2.1 perseant #endif
1675 1.1 christos
1676 1.1 christos if (symsect != NULL)
1677 1.1 christos {
1678 1.1 christos fp->ctf_nsyms = symsect->cts_size / symsect->cts_entsize;
1679 1.1 christos fp->ctf_sxlate = malloc (fp->ctf_nsyms * sizeof (uint32_t));
1680 1.1 christos
1681 1.1 christos if (fp->ctf_sxlate == NULL)
1682 1.1 christos {
1683 1.1 christos err = ENOMEM;
1684 1.1 christos goto bad;
1685 1.1 christos }
1686 1.1 christos }
1687 1.1 christos
1688 1.1.1.1.2.1 perseant if ((err = init_symtab (fp, hp, symsect)) != 0)
1689 1.1.1.1.2.1 perseant goto bad;
1690 1.1.1.1.2.1 perseant
1691 1.1 christos ctf_set_ctl_hashes (fp);
1692 1.1 christos
1693 1.1 christos if (symsect != NULL)
1694 1.1 christos {
1695 1.1 christos if (symsect->cts_entsize == sizeof (Elf64_Sym))
1696 1.1 christos (void) ctf_setmodel (fp, CTF_MODEL_LP64);
1697 1.1 christos else
1698 1.1 christos (void) ctf_setmodel (fp, CTF_MODEL_ILP32);
1699 1.1 christos }
1700 1.1 christos else
1701 1.1 christos (void) ctf_setmodel (fp, CTF_MODEL_NATIVE);
1702 1.1 christos
1703 1.1 christos fp->ctf_refcnt = 1;
1704 1.1 christos return fp;
1705 1.1 christos
1706 1.1 christos bad:
1707 1.1 christos ctf_set_open_errno (errp, err);
1708 1.1 christos ctf_err_warn_to_open (fp);
1709 1.1.1.1.2.1 perseant ctf_dict_close (fp);
1710 1.1 christos return NULL;
1711 1.1 christos }
1712 1.1 christos
1713 1.1.1.1.2.1 perseant /* Bump the refcount on the specified CTF dict, to allow export of ctf_dict_t's
1714 1.1.1.1.2.1 perseant from iterators that open and close the ctf_dict_t around the loop. (This
1715 1.1.1.1.2.1 perseant does not extend their lifetime beyond that of the ctf_archive_t in which they
1716 1.1.1.1.2.1 perseant are contained.) */
1717 1.1 christos
1718 1.1 christos void
1719 1.1.1.1.2.1 perseant ctf_ref (ctf_dict_t *fp)
1720 1.1 christos {
1721 1.1 christos fp->ctf_refcnt++;
1722 1.1 christos }
1723 1.1 christos
1724 1.1.1.1.2.1 perseant /* Close the specified CTF dict and free associated data structures. Note that
1725 1.1.1.1.2.1 perseant ctf_dict_close() is a reference counted operation: if the specified file is
1726 1.1.1.1.2.1 perseant the parent of other active dict, its reference count will be greater than one
1727 1.1.1.1.2.1 perseant and it will be freed later when no active children exist. */
1728 1.1 christos
1729 1.1 christos void
1730 1.1.1.1.2.1 perseant ctf_dict_close (ctf_dict_t *fp)
1731 1.1 christos {
1732 1.1 christos ctf_dtdef_t *dtd, *ntd;
1733 1.1 christos ctf_dvdef_t *dvd, *nvd;
1734 1.1.1.1.2.1 perseant ctf_in_flight_dynsym_t *did, *nid;
1735 1.1 christos ctf_err_warning_t *err, *nerr;
1736 1.1 christos
1737 1.1 christos if (fp == NULL)
1738 1.1.1.1.2.1 perseant return; /* Allow ctf_dict_close(NULL) to simplify caller code. */
1739 1.1 christos
1740 1.1.1.1.2.1 perseant ctf_dprintf ("ctf_dict_close(%p) refcnt=%u\n", (void *) fp, fp->ctf_refcnt);
1741 1.1 christos
1742 1.1 christos if (fp->ctf_refcnt > 1)
1743 1.1 christos {
1744 1.1 christos fp->ctf_refcnt--;
1745 1.1 christos return;
1746 1.1 christos }
1747 1.1 christos
1748 1.1 christos /* It is possible to recurse back in here, notably if dicts in the
1749 1.1 christos ctf_link_inputs or ctf_link_outputs cite this dict as a parent without
1750 1.1 christos using ctf_import_unref. Do nothing in that case. */
1751 1.1 christos if (fp->ctf_refcnt == 0)
1752 1.1 christos return;
1753 1.1 christos
1754 1.1 christos fp->ctf_refcnt--;
1755 1.1 christos free (fp->ctf_dyncuname);
1756 1.1 christos free (fp->ctf_dynparname);
1757 1.1 christos if (fp->ctf_parent && !fp->ctf_parent_unreffed)
1758 1.1.1.1.2.1 perseant ctf_dict_close (fp->ctf_parent);
1759 1.1 christos
1760 1.1 christos for (dtd = ctf_list_next (&fp->ctf_dtdefs); dtd != NULL; dtd = ntd)
1761 1.1 christos {
1762 1.1 christos ntd = ctf_list_next (dtd);
1763 1.1 christos ctf_dtd_delete (fp, dtd);
1764 1.1 christos }
1765 1.1 christos ctf_dynhash_destroy (fp->ctf_dthash);
1766 1.1 christos if (fp->ctf_flags & LCTF_RDWR)
1767 1.1 christos {
1768 1.1 christos ctf_dynhash_destroy (fp->ctf_structs.ctn_writable);
1769 1.1 christos ctf_dynhash_destroy (fp->ctf_unions.ctn_writable);
1770 1.1 christos ctf_dynhash_destroy (fp->ctf_enums.ctn_writable);
1771 1.1 christos ctf_dynhash_destroy (fp->ctf_names.ctn_writable);
1772 1.1 christos }
1773 1.1 christos else
1774 1.1 christos {
1775 1.1 christos ctf_hash_destroy (fp->ctf_structs.ctn_readonly);
1776 1.1 christos ctf_hash_destroy (fp->ctf_unions.ctn_readonly);
1777 1.1 christos ctf_hash_destroy (fp->ctf_enums.ctn_readonly);
1778 1.1 christos ctf_hash_destroy (fp->ctf_names.ctn_readonly);
1779 1.1 christos }
1780 1.1 christos
1781 1.1 christos for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
1782 1.1 christos {
1783 1.1 christos nvd = ctf_list_next (dvd);
1784 1.1 christos ctf_dvd_delete (fp, dvd);
1785 1.1 christos }
1786 1.1 christos ctf_dynhash_destroy (fp->ctf_dvhash);
1787 1.1.1.1.2.1 perseant
1788 1.1.1.1.2.1 perseant ctf_dynhash_destroy (fp->ctf_symhash);
1789 1.1.1.1.2.1 perseant free (fp->ctf_funcidx_sxlate);
1790 1.1.1.1.2.1 perseant free (fp->ctf_objtidx_sxlate);
1791 1.1.1.1.2.1 perseant ctf_dynhash_destroy (fp->ctf_objthash);
1792 1.1.1.1.2.1 perseant ctf_dynhash_destroy (fp->ctf_funchash);
1793 1.1.1.1.2.1 perseant free (fp->ctf_dynsymidx);
1794 1.1.1.1.2.1 perseant ctf_dynhash_destroy (fp->ctf_dynsyms);
1795 1.1.1.1.2.1 perseant for (did = ctf_list_next (&fp->ctf_in_flight_dynsyms); did != NULL; did = nid)
1796 1.1.1.1.2.1 perseant {
1797 1.1.1.1.2.1 perseant nid = ctf_list_next (did);
1798 1.1.1.1.2.1 perseant ctf_list_delete (&fp->ctf_in_flight_dynsyms, did);
1799 1.1.1.1.2.1 perseant free (did);
1800 1.1.1.1.2.1 perseant }
1801 1.1.1.1.2.1 perseant
1802 1.1 christos ctf_str_free_atoms (fp);
1803 1.1 christos free (fp->ctf_tmp_typeslice);
1804 1.1 christos
1805 1.1 christos if (fp->ctf_data.cts_name != _CTF_NULLSTR)
1806 1.1 christos free ((char *) fp->ctf_data.cts_name);
1807 1.1 christos
1808 1.1 christos if (fp->ctf_symtab.cts_name != _CTF_NULLSTR)
1809 1.1 christos free ((char *) fp->ctf_symtab.cts_name);
1810 1.1 christos
1811 1.1 christos if (fp->ctf_strtab.cts_name != _CTF_NULLSTR)
1812 1.1 christos free ((char *) fp->ctf_strtab.cts_name);
1813 1.1 christos else if (fp->ctf_data_mmapped)
1814 1.1 christos ctf_munmap (fp->ctf_data_mmapped, fp->ctf_data_mmapped_len);
1815 1.1 christos
1816 1.1 christos free (fp->ctf_dynbase);
1817 1.1 christos
1818 1.1 christos ctf_dynhash_destroy (fp->ctf_syn_ext_strtab);
1819 1.1 christos ctf_dynhash_destroy (fp->ctf_link_inputs);
1820 1.1 christos ctf_dynhash_destroy (fp->ctf_link_outputs);
1821 1.1 christos ctf_dynhash_destroy (fp->ctf_link_type_mapping);
1822 1.1 christos ctf_dynhash_destroy (fp->ctf_link_in_cu_mapping);
1823 1.1 christos ctf_dynhash_destroy (fp->ctf_link_out_cu_mapping);
1824 1.1 christos ctf_dynhash_destroy (fp->ctf_add_processing);
1825 1.1 christos ctf_dedup_fini (fp, NULL, 0);
1826 1.1 christos ctf_dynset_destroy (fp->ctf_dedup_atoms_alloc);
1827 1.1 christos
1828 1.1 christos for (err = ctf_list_next (&fp->ctf_errs_warnings); err != NULL; err = nerr)
1829 1.1 christos {
1830 1.1 christos nerr = ctf_list_next (err);
1831 1.1 christos ctf_list_delete (&fp->ctf_errs_warnings, err);
1832 1.1 christos free (err->cew_text);
1833 1.1 christos free (err);
1834 1.1 christos }
1835 1.1 christos
1836 1.1 christos free (fp->ctf_sxlate);
1837 1.1 christos free (fp->ctf_txlate);
1838 1.1 christos free (fp->ctf_ptrtab);
1839 1.1.1.1.2.1 perseant free (fp->ctf_pptrtab);
1840 1.1 christos
1841 1.1 christos free (fp->ctf_header);
1842 1.1 christos free (fp);
1843 1.1 christos }
1844 1.1 christos
1845 1.1.1.1.2.1 perseant /* Backward compatibility. */
1846 1.1.1.1.2.1 perseant void
1847 1.1.1.1.2.1 perseant ctf_file_close (ctf_file_t *fp)
1848 1.1.1.1.2.1 perseant {
1849 1.1.1.1.2.1 perseant ctf_dict_close (fp);
1850 1.1.1.1.2.1 perseant }
1851 1.1.1.1.2.1 perseant
1852 1.1 christos /* The converse of ctf_open(). ctf_open() disguises whatever it opens as an
1853 1.1 christos archive, so closing one is just like closing an archive. */
1854 1.1 christos void
1855 1.1 christos ctf_close (ctf_archive_t *arc)
1856 1.1 christos {
1857 1.1 christos ctf_arc_close (arc);
1858 1.1 christos }
1859 1.1 christos
1860 1.1.1.1.2.1 perseant /* Get the CTF archive from which this ctf_dict_t is derived. */
1861 1.1 christos ctf_archive_t *
1862 1.1.1.1.2.1 perseant ctf_get_arc (const ctf_dict_t *fp)
1863 1.1 christos {
1864 1.1 christos return fp->ctf_archive;
1865 1.1 christos }
1866 1.1 christos
1867 1.1 christos /* Return the ctfsect out of the core ctf_impl. Useful for freeing the
1868 1.1.1.1.2.1 perseant ctfsect's data * after ctf_dict_close(), which is why we return the actual
1869 1.1 christos structure, not a pointer to it, since that is likely to become a pointer to
1870 1.1 christos freed data before the return value is used under the expected use case of
1871 1.1.1.1.2.1 perseant ctf_getsect()/ ctf_dict_close()/free(). */
1872 1.1 christos ctf_sect_t
1873 1.1.1.1.2.1 perseant ctf_getdatasect (const ctf_dict_t *fp)
1874 1.1 christos {
1875 1.1 christos return fp->ctf_data;
1876 1.1 christos }
1877 1.1 christos
1878 1.1.1.1.2.1 perseant ctf_sect_t
1879 1.1.1.1.2.1 perseant ctf_getsymsect (const ctf_dict_t *fp)
1880 1.1.1.1.2.1 perseant {
1881 1.1.1.1.2.1 perseant return fp->ctf_symtab;
1882 1.1.1.1.2.1 perseant }
1883 1.1.1.1.2.1 perseant
1884 1.1.1.1.2.1 perseant ctf_sect_t
1885 1.1.1.1.2.1 perseant ctf_getstrsect (const ctf_dict_t *fp)
1886 1.1.1.1.2.1 perseant {
1887 1.1.1.1.2.1 perseant return fp->ctf_strtab;
1888 1.1.1.1.2.1 perseant }
1889 1.1.1.1.2.1 perseant
1890 1.1.1.1.2.1 perseant /* Set the endianness of the symbol table attached to FP. */
1891 1.1.1.1.2.1 perseant void
1892 1.1.1.1.2.1 perseant ctf_symsect_endianness (ctf_dict_t *fp, int little_endian)
1893 1.1.1.1.2.1 perseant {
1894 1.1.1.1.2.1 perseant int old_endianness = fp->ctf_symsect_little_endian;
1895 1.1.1.1.2.1 perseant
1896 1.1.1.1.2.1 perseant fp->ctf_symsect_little_endian = !!little_endian;
1897 1.1.1.1.2.1 perseant
1898 1.1.1.1.2.1 perseant /* If we already have a symtab translation table, we need to repopulate it if
1899 1.1.1.1.2.1 perseant our idea of the endianness has changed. */
1900 1.1.1.1.2.1 perseant
1901 1.1.1.1.2.1 perseant if (old_endianness != fp->ctf_symsect_little_endian
1902 1.1.1.1.2.1 perseant && fp->ctf_sxlate != NULL && fp->ctf_symtab.cts_data != NULL)
1903 1.1.1.1.2.1 perseant assert (init_symtab (fp, fp->ctf_header, &fp->ctf_symtab) == 0);
1904 1.1.1.1.2.1 perseant }
1905 1.1.1.1.2.1 perseant
1906 1.1.1.1.2.1 perseant /* Return the CTF handle for the parent CTF dict, if one exists. Otherwise
1907 1.1.1.1.2.1 perseant return NULL to indicate this dict has no imported parent. */
1908 1.1.1.1.2.1 perseant ctf_dict_t *
1909 1.1.1.1.2.1 perseant ctf_parent_dict (ctf_dict_t *fp)
1910 1.1 christos {
1911 1.1 christos return fp->ctf_parent;
1912 1.1 christos }
1913 1.1 christos
1914 1.1.1.1.2.1 perseant /* Backward compatibility. */
1915 1.1.1.1.2.1 perseant ctf_dict_t *
1916 1.1.1.1.2.1 perseant ctf_parent_file (ctf_dict_t *fp)
1917 1.1.1.1.2.1 perseant {
1918 1.1.1.1.2.1 perseant return ctf_parent_dict (fp);
1919 1.1.1.1.2.1 perseant }
1920 1.1.1.1.2.1 perseant
1921 1.1.1.1.2.1 perseant /* Return the name of the parent CTF dict, if one exists, or NULL otherwise. */
1922 1.1 christos const char *
1923 1.1.1.1.2.1 perseant ctf_parent_name (ctf_dict_t *fp)
1924 1.1 christos {
1925 1.1 christos return fp->ctf_parname;
1926 1.1 christos }
1927 1.1 christos
1928 1.1 christos /* Set the parent name. It is an error to call this routine without calling
1929 1.1 christos ctf_import() at some point. */
1930 1.1 christos int
1931 1.1.1.1.2.1 perseant ctf_parent_name_set (ctf_dict_t *fp, const char *name)
1932 1.1 christos {
1933 1.1 christos if (fp->ctf_dynparname != NULL)
1934 1.1 christos free (fp->ctf_dynparname);
1935 1.1 christos
1936 1.1 christos if ((fp->ctf_dynparname = strdup (name)) == NULL)
1937 1.1 christos return (ctf_set_errno (fp, ENOMEM));
1938 1.1 christos fp->ctf_parname = fp->ctf_dynparname;
1939 1.1 christos return 0;
1940 1.1 christos }
1941 1.1 christos
1942 1.1 christos /* Return the name of the compilation unit this CTF file applies to. Usually
1943 1.1.1.1.2.1 perseant non-NULL only for non-parent dicts. */
1944 1.1 christos const char *
1945 1.1.1.1.2.1 perseant ctf_cuname (ctf_dict_t *fp)
1946 1.1 christos {
1947 1.1 christos return fp->ctf_cuname;
1948 1.1 christos }
1949 1.1 christos
1950 1.1 christos /* Set the compilation unit name. */
1951 1.1 christos int
1952 1.1.1.1.2.1 perseant ctf_cuname_set (ctf_dict_t *fp, const char *name)
1953 1.1 christos {
1954 1.1 christos if (fp->ctf_dyncuname != NULL)
1955 1.1 christos free (fp->ctf_dyncuname);
1956 1.1 christos
1957 1.1 christos if ((fp->ctf_dyncuname = strdup (name)) == NULL)
1958 1.1 christos return (ctf_set_errno (fp, ENOMEM));
1959 1.1 christos fp->ctf_cuname = fp->ctf_dyncuname;
1960 1.1 christos return 0;
1961 1.1 christos }
1962 1.1 christos
1963 1.1.1.1.2.1 perseant /* Import the types from the specified parent dict by storing a pointer to it in
1964 1.1.1.1.2.1 perseant ctf_parent and incrementing its reference count. Only one parent is allowed:
1965 1.1.1.1.2.1 perseant if a parent already exists, it is replaced by the new parent. The pptrtab
1966 1.1.1.1.2.1 perseant is wiped, and will be refreshed by the next ctf_lookup_by_name call. */
1967 1.1 christos int
1968 1.1.1.1.2.1 perseant ctf_import (ctf_dict_t *fp, ctf_dict_t *pfp)
1969 1.1 christos {
1970 1.1 christos if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
1971 1.1 christos return (ctf_set_errno (fp, EINVAL));
1972 1.1 christos
1973 1.1 christos if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
1974 1.1 christos return (ctf_set_errno (fp, ECTF_DMODEL));
1975 1.1 christos
1976 1.1 christos if (fp->ctf_parent && !fp->ctf_parent_unreffed)
1977 1.1.1.1.2.1 perseant ctf_dict_close (fp->ctf_parent);
1978 1.1 christos fp->ctf_parent = NULL;
1979 1.1 christos
1980 1.1.1.1.2.1 perseant free (fp->ctf_pptrtab);
1981 1.1.1.1.2.1 perseant fp->ctf_pptrtab = NULL;
1982 1.1.1.1.2.1 perseant fp->ctf_pptrtab_len = 0;
1983 1.1.1.1.2.1 perseant fp->ctf_pptrtab_typemax = 0;
1984 1.1.1.1.2.1 perseant
1985 1.1 christos if (pfp != NULL)
1986 1.1 christos {
1987 1.1 christos int err;
1988 1.1 christos
1989 1.1 christos if (fp->ctf_parname == NULL)
1990 1.1 christos if ((err = ctf_parent_name_set (fp, "PARENT")) < 0)
1991 1.1 christos return err;
1992 1.1 christos
1993 1.1 christos fp->ctf_flags |= LCTF_CHILD;
1994 1.1 christos pfp->ctf_refcnt++;
1995 1.1 christos fp->ctf_parent_unreffed = 0;
1996 1.1 christos }
1997 1.1 christos
1998 1.1 christos fp->ctf_parent = pfp;
1999 1.1 christos return 0;
2000 1.1 christos }
2001 1.1 christos
2002 1.1 christos /* Like ctf_import, but does not increment the refcount on the imported parent
2003 1.1 christos or close it at any point: as a result it can go away at any time and the
2004 1.1 christos caller must do all freeing itself. Used internally to avoid refcount
2005 1.1 christos loops. */
2006 1.1 christos int
2007 1.1.1.1.2.1 perseant ctf_import_unref (ctf_dict_t *fp, ctf_dict_t *pfp)
2008 1.1 christos {
2009 1.1 christos if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
2010 1.1 christos return (ctf_set_errno (fp, EINVAL));
2011 1.1 christos
2012 1.1 christos if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
2013 1.1 christos return (ctf_set_errno (fp, ECTF_DMODEL));
2014 1.1 christos
2015 1.1 christos if (fp->ctf_parent && !fp->ctf_parent_unreffed)
2016 1.1.1.1.2.1 perseant ctf_dict_close (fp->ctf_parent);
2017 1.1 christos fp->ctf_parent = NULL;
2018 1.1 christos
2019 1.1.1.1.2.1 perseant free (fp->ctf_pptrtab);
2020 1.1.1.1.2.1 perseant fp->ctf_pptrtab = NULL;
2021 1.1.1.1.2.1 perseant fp->ctf_pptrtab_len = 0;
2022 1.1.1.1.2.1 perseant fp->ctf_pptrtab_typemax = 0;
2023 1.1 christos if (pfp != NULL)
2024 1.1 christos {
2025 1.1 christos int err;
2026 1.1 christos
2027 1.1 christos if (fp->ctf_parname == NULL)
2028 1.1 christos if ((err = ctf_parent_name_set (fp, "PARENT")) < 0)
2029 1.1 christos return err;
2030 1.1 christos
2031 1.1 christos fp->ctf_flags |= LCTF_CHILD;
2032 1.1 christos fp->ctf_parent_unreffed = 1;
2033 1.1 christos }
2034 1.1 christos
2035 1.1 christos fp->ctf_parent = pfp;
2036 1.1 christos return 0;
2037 1.1 christos }
2038 1.1 christos
2039 1.1.1.1.2.1 perseant /* Set the data model constant for the CTF dict. */
2040 1.1 christos int
2041 1.1.1.1.2.1 perseant ctf_setmodel (ctf_dict_t *fp, int model)
2042 1.1 christos {
2043 1.1 christos const ctf_dmodel_t *dp;
2044 1.1 christos
2045 1.1 christos for (dp = _libctf_models; dp->ctd_name != NULL; dp++)
2046 1.1 christos {
2047 1.1 christos if (dp->ctd_code == model)
2048 1.1 christos {
2049 1.1 christos fp->ctf_dmodel = dp;
2050 1.1 christos return 0;
2051 1.1 christos }
2052 1.1 christos }
2053 1.1 christos
2054 1.1 christos return (ctf_set_errno (fp, EINVAL));
2055 1.1 christos }
2056 1.1 christos
2057 1.1.1.1.2.1 perseant /* Return the data model constant for the CTF dict. */
2058 1.1 christos int
2059 1.1.1.1.2.1 perseant ctf_getmodel (ctf_dict_t *fp)
2060 1.1 christos {
2061 1.1 christos return fp->ctf_dmodel->ctd_code;
2062 1.1 christos }
2063 1.1 christos
2064 1.1.1.1.2.1 perseant /* The caller can hang an arbitrary pointer off each ctf_dict_t using this
2065 1.1 christos function. */
2066 1.1 christos void
2067 1.1.1.1.2.1 perseant ctf_setspecific (ctf_dict_t *fp, void *data)
2068 1.1 christos {
2069 1.1 christos fp->ctf_specific = data;
2070 1.1 christos }
2071 1.1 christos
2072 1.1 christos /* Retrieve the arbitrary pointer again. */
2073 1.1 christos void *
2074 1.1.1.1.2.1 perseant ctf_getspecific (ctf_dict_t *fp)
2075 1.1 christos {
2076 1.1 christos return fp->ctf_specific;
2077 1.1 christos }
2078