2 Copyright (C) 2019-2020 Free Software Foundation, Inc.
4 This file is part of libctf.
6 libctf is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
11 This program is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 See the GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; see the file COPYING. If not see
18 <http://www.gnu.org/licenses/>. */
27 /* Type tracking machinery. */
29 /* Record the correspondence between a source and ctf_add_type()-added
30 destination type: both types are translated into parent type IDs if need be,
31 so they relate to the actual container they are in. Outside controlled
32 circumstances (like linking) it is probably not useful to do more than
33 compare these pointers, since there is nothing stopping the user closing the
34 source container whenever they want to.
36 Our OOM handling here is just to not do anything, because this is called deep
37 enough in the call stack that doing anything useful is painfully difficult:
38 the worst consequence if we do OOM is a bit of type duplication anyway. */
41 ctf_add_type_mapping (ctf_file_t
*src_fp
, ctf_id_t src_type
,
42 ctf_file_t
*dst_fp
, ctf_id_t dst_type
)
44 if (LCTF_TYPE_ISPARENT (src_fp
, src_type
) && src_fp
->ctf_parent
)
45 src_fp
= src_fp
->ctf_parent
;
47 src_type
= LCTF_TYPE_TO_INDEX(src_fp
, src_type
);
49 if (LCTF_TYPE_ISPARENT (dst_fp
, dst_type
) && dst_fp
->ctf_parent
)
50 dst_fp
= dst_fp
->ctf_parent
;
52 dst_type
= LCTF_TYPE_TO_INDEX(dst_fp
, dst_type
);
54 /* This dynhash is a bit tricky: it has a multivalued (structural) key, so we
55 need to use the sized-hash machinery to generate key hashing and equality
58 if (dst_fp
->ctf_link_type_mapping
== NULL
)
60 ctf_hash_fun f
= ctf_hash_type_key
;
61 ctf_hash_eq_fun e
= ctf_hash_eq_type_key
;
63 if ((dst_fp
->ctf_link_type_mapping
= ctf_dynhash_create (f
, e
, free
,
68 ctf_link_type_key_t
*key
;
69 key
= calloc (1, sizeof (struct ctf_link_type_key
));
73 key
->cltk_fp
= src_fp
;
74 key
->cltk_idx
= src_type
;
76 /* No OOM checking needed, because if this doesn't work the worst we'll do is
77 add a few more duplicate types (which will probably run out of memory
79 ctf_dynhash_insert (dst_fp
->ctf_link_type_mapping
, key
,
80 (void *) (uintptr_t) dst_type
);
83 /* Look up a type mapping: return 0 if none. The DST_FP is modified to point to
84 the parent if need be. The ID returned is from the dst_fp's perspective. */
86 ctf_type_mapping (ctf_file_t
*src_fp
, ctf_id_t src_type
, ctf_file_t
**dst_fp
)
88 ctf_link_type_key_t key
;
89 ctf_file_t
*target_fp
= *dst_fp
;
90 ctf_id_t dst_type
= 0;
92 if (LCTF_TYPE_ISPARENT (src_fp
, src_type
) && src_fp
->ctf_parent
)
93 src_fp
= src_fp
->ctf_parent
;
95 src_type
= LCTF_TYPE_TO_INDEX(src_fp
, src_type
);
97 key
.cltk_idx
= src_type
;
99 if (target_fp
->ctf_link_type_mapping
)
100 dst_type
= (uintptr_t) ctf_dynhash_lookup (target_fp
->ctf_link_type_mapping
,
105 dst_type
= LCTF_INDEX_TO_TYPE (target_fp
, dst_type
,
106 target_fp
->ctf_parent
!= NULL
);
111 if (target_fp
->ctf_parent
)
112 target_fp
= target_fp
->ctf_parent
;
116 if (target_fp
->ctf_link_type_mapping
)
117 dst_type
= (uintptr_t) ctf_dynhash_lookup (target_fp
->ctf_link_type_mapping
,
121 dst_type
= LCTF_INDEX_TO_TYPE (target_fp
, dst_type
,
122 target_fp
->ctf_parent
!= NULL
);
130 CTF linking consists of adding CTF archives full of content to be merged into
131 this one to the current file (which must be writable) by calling
132 ctf_link_add_ctf(). Once this is done, a call to ctf_link() will merge the
133 type tables together, generating new CTF files as needed, with this one as a
134 parent, to contain types from the inputs which conflict.
135 ctf_link_add_strtab() takes a callback which provides string/offset pairs to
136 be added to the external symbol table and deduplicated from all CTF string
137 tables in the output link; ctf_link_shuffle_syms() takes a callback which
138 provides symtab entries in ascending order, and shuffles the function and
139 data sections to match; and ctf_link_write() emits a CTF file (if there are
140 no conflicts requiring per-compilation-unit sub-CTF files) or CTF archives
141 (otherwise) and returns it, suitable for addition in the .ctf section of the
144 /* Return the name of the compilation unit this CTF dict or its parent applies
145 to, or a non-null string otherwise: prefer the parent. Used in debugging
146 output. Sometimes used for outputs too. */
148 ctf_link_input_name (ctf_file_t
*fp
)
150 if (fp
->ctf_parent
&& fp
->ctf_parent
->ctf_cuname
)
151 return fp
->ctf_parent
->ctf_cuname
;
152 else if (fp
->ctf_cuname
)
153 return fp
->ctf_cuname
;
158 /* The linker inputs look like this. clin_fp is used for short-circuited
159 CU-mapped links that can entirely avoid the first link phase in some
160 situations in favour of just passing on the contained ctf_file_t: it is
161 always the sole ctf_file_t inside the corresponding clin_arc. If set, it
162 gets assigned directly to the final link inputs and freed from there, so it
163 never gets explicitly freed in the ctf_link_input. */
164 typedef struct ctf_link_input
166 const char *clin_filename
;
167 ctf_archive_t
*clin_arc
;
173 ctf_link_input_close (void *input
)
175 ctf_link_input_t
*i
= (ctf_link_input_t
*) input
;
177 ctf_arc_close (i
->clin_arc
);
181 /* Like ctf_link_add_ctf, below, but with no error-checking, so it can be called
182 in the middle of an ongoing link. */
184 ctf_link_add_ctf_internal (ctf_file_t
*fp
, ctf_archive_t
*ctf
,
185 ctf_file_t
*fp_input
, const char *name
)
187 ctf_link_input_t
*input
= NULL
;
188 char *dupname
= NULL
;
190 if ((input
= calloc (1, sizeof (ctf_link_input_t
))) == NULL
)
193 if ((dupname
= strdup (name
)) == NULL
)
196 input
->clin_arc
= ctf
;
197 input
->clin_fp
= fp_input
;
198 input
->clin_filename
= dupname
;
199 input
->n
= ctf_dynhash_elements (fp
->ctf_link_inputs
);
201 if (ctf_dynhash_insert (fp
->ctf_link_inputs
, dupname
, input
) < 0)
208 return ctf_set_errno (fp
, ENOMEM
);
211 /* Add a file, memory buffer, or unopened file (by name) to a link.
213 You can call this with:
215 CTF and NAME: link the passed ctf_archive_t, with the given NAME.
216 NAME alone: open NAME as a CTF file when needed.
217 BUF and NAME: open the BUF (of length N) as CTF, with the given NAME. (Not
220 Passed in CTF args are owned by the dictionary and will be freed by it.
221 The BUF arg is *not* owned by the dictionary, and the user should not free
222 its referent until the link is done.
224 The order of calls to this function influences the order of types in the
225 final link output, but otherwise is not important.
227 Private for now, but may in time become public once support for BUF is
231 ctf_link_add (ctf_file_t
*fp
, ctf_archive_t
*ctf
, const char *name
,
232 void *buf _libctf_unused_
, size_t n _libctf_unused_
)
235 return (ctf_set_errno (fp
, ECTF_NOTYET
));
237 if (!((ctf
&& name
&& !buf
)
238 || (name
&& !buf
&& !ctf
)
239 || (buf
&& name
&& !ctf
)))
240 return (ctf_set_errno (fp
, EINVAL
));
242 /* We can only lazily open files if libctf.so is in use rather than
243 libctf-nobfd.so. This is a little tricky: in shared libraries, we can use
244 a weak symbol so that -lctf -lctf-nobfd works, but in static libraries we
245 must distinguish between the two libraries explicitly. */
248 if (!buf
&& !ctf
&& name
&& !ctf_open
)
249 return (ctf_set_errno (fp
, ECTF_NEEDSBFD
));
251 if (!buf
&& !ctf
&& name
)
252 return (ctf_set_errno (fp
, ECTF_NEEDSBFD
));
255 if (fp
->ctf_link_outputs
)
256 return (ctf_set_errno (fp
, ECTF_LINKADDEDLATE
));
257 if (fp
->ctf_link_inputs
== NULL
)
258 fp
->ctf_link_inputs
= ctf_dynhash_create (ctf_hash_string
,
259 ctf_hash_eq_string
, free
,
260 ctf_link_input_close
);
262 if (fp
->ctf_link_inputs
== NULL
)
263 return (ctf_set_errno (fp
, ENOMEM
));
265 return ctf_link_add_ctf_internal (fp
, ctf
, NULL
, name
);
268 /* Add an opened CTF archive or unopened file (by name) to a link.
269 If CTF is NULL and NAME is non-null, an unopened file is meant:
270 otherwise, the specified archive is assumed to have the given NAME.
272 Passed in CTF args are owned by the dictionary and will be freed by it.
274 The order of calls to this function influences the order of types in the
275 final link output, but otherwise is not important. */
278 ctf_link_add_ctf (ctf_file_t
*fp
, ctf_archive_t
*ctf
, const char *name
)
280 return ctf_link_add (fp
, ctf
, name
, NULL
, 0);
283 /* Return a per-CU output CTF dictionary suitable for the given CU, creating and
284 interning it if need be. */
287 ctf_create_per_cu (ctf_file_t
*fp
, const char *filename
, const char *cuname
)
290 const char *ctf_name
= NULL
;
291 char *dynname
= NULL
;
293 /* First, check the mapping table and translate the per-CU name we use
294 accordingly. We check both the input filename and the CU name. Only if
295 neither are set do we fall back to the input filename as the per-CU
296 dictionary name. We prefer the filename because this is easier for likely
297 callers to determine. */
299 if (fp
->ctf_link_in_cu_mapping
)
301 if (((ctf_name
= ctf_dynhash_lookup (fp
->ctf_link_in_cu_mapping
,
302 filename
)) == NULL
) &&
303 ((ctf_name
= ctf_dynhash_lookup (fp
->ctf_link_in_cu_mapping
,
308 if (ctf_name
== NULL
)
311 if ((cu_fp
= ctf_dynhash_lookup (fp
->ctf_link_outputs
, ctf_name
)) == NULL
)
315 if ((cu_fp
= ctf_create (&err
)) == NULL
)
317 ctf_err_warn (fp
, 0, err
, _("cannot create per-CU CTF archive for "
318 "CU %s from input file %s"),
320 ctf_set_errno (fp
, err
);
324 if ((dynname
= strdup (ctf_name
)) == NULL
)
326 if (ctf_dynhash_insert (fp
->ctf_link_outputs
, dynname
, cu_fp
) < 0)
329 ctf_import_unref (cu_fp
, fp
);
330 ctf_cuname_set (cu_fp
, cuname
);
331 ctf_parent_name_set (cu_fp
, _CTF_SECTION
);
337 ctf_file_close (cu_fp
);
338 ctf_set_errno (fp
, ENOMEM
);
342 /* Add a mapping directing that the CU named FROM should have its
343 conflicting/non-duplicate types (depending on link mode) go into a container
344 named TO. Many FROMs can share a TO.
346 We forcibly add a container named TO in every case, even though it may well
347 wind up empty, because clients that use this facility usually expect to find
348 every TO container present, even if empty, and malfunction otherwise. */
351 ctf_link_add_cu_mapping (ctf_file_t
*fp
, const char *from
, const char *to
)
354 char *f
= NULL
, *t
= NULL
;
355 ctf_dynhash_t
*one_out
;
357 if (fp
->ctf_link_in_cu_mapping
== NULL
)
358 fp
->ctf_link_in_cu_mapping
= ctf_dynhash_create (ctf_hash_string
,
359 ctf_hash_eq_string
, free
,
361 if (fp
->ctf_link_in_cu_mapping
== NULL
)
364 if (fp
->ctf_link_out_cu_mapping
== NULL
)
365 fp
->ctf_link_out_cu_mapping
= ctf_dynhash_create (ctf_hash_string
,
366 ctf_hash_eq_string
, free
,
368 ctf_dynhash_destroy
);
369 if (fp
->ctf_link_out_cu_mapping
== NULL
)
377 /* Track both in a list from FROM to TO and in a list from TO to a list of
378 FROM. The former is used to create TUs with the mapped-to name at need:
379 the latter is used in deduplicating links to pull in all input CUs
380 corresponding to a single output CU. */
382 if ((err
= ctf_dynhash_insert (fp
->ctf_link_in_cu_mapping
, f
, t
)) < 0)
384 ctf_set_errno (fp
, err
);
388 /* f and t are now owned by the in_cu_mapping: reallocate them. */
394 if ((one_out
= ctf_dynhash_lookup (fp
->ctf_link_out_cu_mapping
, t
)) == NULL
)
396 if ((one_out
= ctf_dynhash_create (ctf_hash_string
, ctf_hash_eq_string
,
397 free
, NULL
)) == NULL
)
399 if ((err
= ctf_dynhash_insert (fp
->ctf_link_out_cu_mapping
,
402 ctf_dynhash_destroy (one_out
);
403 ctf_set_errno (fp
, err
);
410 if (ctf_dynhash_insert (one_out
, f
, NULL
) < 0)
412 ctf_set_errno (fp
, err
);
419 ctf_set_errno (fp
, errno
);
426 /* Set a function which is called to transform the names of archive members.
427 This is useful for applying regular transformations to many names, where
428 ctf_link_add_cu_mapping applies arbitrarily irregular changes to single
429 names. The member name changer is applied at ctf_link_write time, so it
430 cannot conflate multiple CUs into one the way ctf_link_add_cu_mapping can.
431 The changer function accepts a name and should return a new
432 dynamically-allocated name, or NULL if the name should be left unchanged. */
434 ctf_link_set_memb_name_changer (ctf_file_t
*fp
,
435 ctf_link_memb_name_changer_f
*changer
,
438 fp
->ctf_link_memb_name_changer
= changer
;
439 fp
->ctf_link_memb_name_changer_arg
= arg
;
442 typedef struct ctf_link_in_member_cb_arg
444 /* The shared output dictionary. */
447 /* The filename of the input file, and an fp to each dictionary in that file
449 const char *in_file_name
;
452 /* The CU name of the dict being processed. */
454 int in_input_cu_file
;
456 /* The parent dictionary in the input, and whether it's been processed yet.
457 Not needed by ctf_link_one_type / ctf_link_one_variable, only by higher
459 ctf_file_t
*in_fp_parent
;
462 /* If true, this is the CU-mapped portion of a deduplicating link: no child
463 dictionaries should be created. */
465 } ctf_link_in_member_cb_arg_t
;
467 /* Link one type into the link. We rely on ctf_add_type() to detect
468 duplicates. This is not terribly reliable yet (unnmamed types will be
469 mindlessly duplicated), but will improve shortly. */
472 ctf_link_one_type (ctf_id_t type
, int isroot _libctf_unused_
, void *arg_
)
474 ctf_link_in_member_cb_arg_t
*arg
= (ctf_link_in_member_cb_arg_t
*) arg_
;
475 ctf_file_t
*per_cu_out_fp
;
478 if (arg
->in_fp
->ctf_link_flags
!= CTF_LINK_SHARE_UNCONFLICTED
)
480 ctf_err_warn (arg
->out_fp
, 0, ECTF_NOTYET
,
481 _("share-duplicated mode not yet implemented"));
482 return ctf_set_errno (arg
->out_fp
, ECTF_NOTYET
);
485 /* Simply call ctf_add_type: if it reports a conflict and we're adding to the
486 main CTF file, add to the per-CU archive member instead, creating it if
487 necessary. If we got this type from a per-CU archive member, add it
488 straight back to the corresponding member in the output. */
490 if (!arg
->in_input_cu_file
)
492 if (ctf_add_type (arg
->out_fp
, arg
->in_fp
, type
) != CTF_ERR
)
495 err
= ctf_errno (arg
->out_fp
);
496 if (err
!= ECTF_CONFLICT
)
498 if (err
!= ECTF_NONREPRESENTABLE
)
499 ctf_err_warn (arg
->out_fp
, 1, 0,
500 _("cannot link type %lx from input file %s, CU %s "
501 "into output link"), type
, arg
->cu_name
,
503 /* We must ignore this problem or we end up losing future types, then
504 trying to link the variables in, then exploding. Better to link as
508 ctf_set_errno (arg
->out_fp
, 0);
511 if ((per_cu_out_fp
= ctf_create_per_cu (arg
->out_fp
, arg
->in_file_name
,
512 arg
->cu_name
)) == NULL
)
513 return -1; /* Errno is set for us. */
515 if (ctf_add_type (per_cu_out_fp
, arg
->in_fp
, type
) != CTF_ERR
)
518 err
= ctf_errno (per_cu_out_fp
);
519 if (err
!= ECTF_NONREPRESENTABLE
)
520 ctf_err_warn (arg
->out_fp
, 1, 0,
521 _("cannot link type %lx from input file %s, CU %s "
522 "into output per-CU CTF archive member %s: %s: skipped"),
523 type
, ctf_link_input_name (arg
->in_fp
), arg
->in_file_name
,
524 ctf_link_input_name (per_cu_out_fp
), ctf_errmsg (err
));
525 if (err
== ECTF_CONFLICT
)
526 /* Conflicts are possible at this stage only if a non-ld user has combined
527 multiple TUs into a single output dictionary. Even in this case we do not
528 want to stop the link or propagate the error. */
529 ctf_set_errno (arg
->out_fp
, 0);
531 return 0; /* As above: do not lose types. */
534 /* Set a function which is used to filter out unwanted variables from the link. */
536 ctf_link_set_variable_filter (ctf_file_t
*fp
, ctf_link_variable_filter_f
*filter
,
539 fp
->ctf_link_variable_filter
= filter
;
540 fp
->ctf_link_variable_filter_arg
= arg
;
544 /* Check if we can safely add a variable with the given type to this container. */
547 check_variable (const char *name
, ctf_file_t
*fp
, ctf_id_t type
,
548 ctf_dvdef_t
**out_dvd
)
552 dvd
= ctf_dynhash_lookup (fp
->ctf_dvhash
, name
);
557 if (dvd
->dvd_type
!= type
)
559 /* Variable here. Wrong type: cannot add. Just skip it, because there is
560 no way to express this in CTF. Don't even warn: this case is too
561 common. (This might be the parent, in which case we'll try adding in
562 the child first, and only then give up.) */
563 ctf_dprintf ("Inexpressible duplicate variable %s skipped.\n", name
);
566 return 0; /* Already exists. */
569 /* Link one variable in. */
572 ctf_link_one_variable (const char *name
, ctf_id_t type
, void *arg_
)
574 ctf_link_in_member_cb_arg_t
*arg
= (ctf_link_in_member_cb_arg_t
*) arg_
;
575 ctf_file_t
*per_cu_out_fp
;
576 ctf_id_t dst_type
= 0;
577 ctf_file_t
*check_fp
;
580 /* See if this variable is filtered out. */
582 if (arg
->out_fp
->ctf_link_variable_filter
)
584 void *farg
= arg
->out_fp
->ctf_link_variable_filter_arg
;
585 if (arg
->out_fp
->ctf_link_variable_filter (arg
->in_fp
, name
, type
, farg
))
589 /* In unconflicted link mode, if this type is mapped to a type in the parent
590 container, we want to try to add to that first: if it reports a duplicate,
591 or if the type is in a child already, add straight to the child. */
593 check_fp
= arg
->out_fp
;
595 dst_type
= ctf_type_mapping (arg
->in_fp
, type
, &check_fp
);
598 if (check_fp
== arg
->out_fp
)
600 if (check_variable (name
, check_fp
, dst_type
, &dvd
))
602 /* No variable here: we can add it. */
603 if (ctf_add_variable (check_fp
, name
, dst_type
) < 0)
604 return (ctf_set_errno (arg
->out_fp
, ctf_errno (check_fp
)));
608 /* Already present? Nothing to do. */
609 if (dvd
&& dvd
->dvd_type
== dst_type
)
614 /* Can't add to the parent due to a name clash, or because it references a
615 type only present in the child. Try adding to the child, creating if need
616 be. If we can't do that, skip it. Don't add to a child if we're doing a
617 CU-mapped link, since that has only one output. */
621 ctf_dprintf ("Variable %s in input file %s depends on a type %lx hidden "
622 "due to conflicts: skipped.\n", name
, arg
->in_file_name
,
627 if ((per_cu_out_fp
= ctf_create_per_cu (arg
->out_fp
, arg
->in_file_name
,
628 arg
->cu_name
)) == NULL
)
629 return -1; /* Errno is set for us. */
631 /* If the type was not found, check for it in the child too. */
634 check_fp
= per_cu_out_fp
;
635 dst_type
= ctf_type_mapping (arg
->in_fp
, type
, &check_fp
);
639 ctf_err_warn (arg
->out_fp
, 1, 0,
640 _("type %lx for variable %s in input file %s "
641 "not found: skipped"), type
, name
,
643 /* Do not terminate the link: just skip the variable. */
648 if (check_variable (name
, per_cu_out_fp
, dst_type
, &dvd
))
649 if (ctf_add_variable (per_cu_out_fp
, name
, dst_type
) < 0)
650 return (ctf_set_errno (arg
->out_fp
, ctf_errno (per_cu_out_fp
)));
654 /* Merge every type (and optionally, variable) in this archive member into the
655 link, so we can relink things that have already had ld run on them. We use
656 the archive member name, sans any leading '.ctf.', as the CU name for
657 ambiguous types if there is one and it's not the default: otherwise, we use
658 the name of the input file. */
660 ctf_link_one_input_archive_member (ctf_file_t
*in_fp
, const char *name
, void *arg_
)
662 ctf_link_in_member_cb_arg_t
*arg
= (ctf_link_in_member_cb_arg_t
*) arg_
;
665 if (strcmp (name
, _CTF_SECTION
) == 0)
667 /* This file is the default member of this archive, and has already been
668 explicitly processed.
670 In the default sharing mode of CTF_LINK_SHARE_UNCONFLICTED, it does no
671 harm to rescan an existing shared repo again: all the types will just
672 end up in the same place. But in CTF_LINK_SHARE_DUPLICATED mode, this
673 causes the system to erroneously conclude that all types are duplicated
674 and should be shared, even if they are not. */
676 if (arg
->done_parent
)
681 /* Get ambiguous types from our parent. */
682 ctf_import (in_fp
, arg
->in_fp_parent
);
683 arg
->in_input_cu_file
= 1;
687 if (strncmp (arg
->cu_name
, ".ctf.", strlen (".ctf.")) == 0)
688 arg
->cu_name
+= strlen (".ctf.");
691 if ((err
= ctf_type_iter_all (in_fp
, ctf_link_one_type
, arg
)) > -1)
692 if (!(in_fp
->ctf_link_flags
& CTF_LINK_OMIT_VARIABLES_SECTION
))
693 err
= ctf_variable_iter (in_fp
, ctf_link_one_variable
, arg
);
695 arg
->in_input_cu_file
= 0;
698 return -1; /* Errno is set for us. */
703 /* Dump the unnecessary link type mapping after one input file is processed. */
705 empty_link_type_mapping (void *key _libctf_unused_
, void *value
,
706 void *arg _libctf_unused_
)
708 ctf_file_t
*fp
= (ctf_file_t
*) value
;
710 if (fp
->ctf_link_type_mapping
)
711 ctf_dynhash_empty (fp
->ctf_link_type_mapping
);
714 /* Lazily open a CTF archive for linking, if not already open.
716 Returns the number of files contained within the opened archive (0 for none),
717 or -1 on error, as usual. */
719 ctf_link_lazy_open (ctf_file_t
*fp
, ctf_link_input_t
*input
)
725 return ctf_archive_count (input
->clin_arc
);
730 /* See ctf_link_add_ctf. */
731 #if defined (PIC) || !NOBFD
732 input
->clin_arc
= ctf_open (input
->clin_filename
, NULL
, &err
);
734 ctf_err_warn (fp
, 0, ECTF_NEEDSBFD
, _("cannot open %s lazily"),
735 input
->clin_filename
);
736 ctf_set_errno (fp
, ECTF_NEEDSBFD
);
740 /* Having no CTF sections is not an error. We just don't need to do
743 if (!input
->clin_arc
)
745 if (err
== ECTF_NOCTFDATA
)
748 ctf_err_warn (fp
, 0, err
, _("opening CTF %s failed"),
749 input
->clin_filename
);
750 ctf_set_errno (fp
, err
);
754 if ((count
= ctf_archive_count (input
->clin_arc
)) == 0)
755 ctf_arc_close (input
->clin_arc
);
757 return (ssize_t
) count
;
760 /* Close an input, as a ctf_dynhash_iter iterator. */
762 ctf_link_close_one_input_archive (void *key _libctf_unused_
, void *value
,
763 void *arg _libctf_unused_
)
765 ctf_link_input_t
*input
= (ctf_link_input_t
*) value
;
767 ctf_arc_close (input
->clin_arc
);
768 input
->clin_arc
= NULL
;
771 /* Link one input file's types into the output file. */
773 ctf_link_one_input_archive (void *key
, void *value
, void *arg_
)
775 const char *file_name
= (const char *) key
;
776 ctf_link_input_t
*input
= (ctf_link_input_t
*)value
;
777 ctf_link_in_member_cb_arg_t
*arg
= (ctf_link_in_member_cb_arg_t
*) arg_
;
780 if (!input
->clin_arc
)
782 err
= ctf_link_lazy_open (arg
->out_fp
, input
);
783 if (err
== 0) /* Just no CTF. */
787 return; /* errno is set for us. */
790 arg
->in_file_name
= file_name
;
791 arg
->done_parent
= 0;
792 if ((arg
->in_fp_parent
= ctf_arc_open_by_name (input
->clin_arc
, NULL
,
794 if (err
!= ECTF_ARNNAME
)
796 ctf_err_warn (arg
->out_fp
, 1, 0,
797 _("cannot open main archive member in input file %s "
798 "in the link: skipping: %s"), arg
->in_file_name
,
803 if (ctf_link_one_input_archive_member (arg
->in_fp_parent
,
804 _CTF_SECTION
, arg
) < 0)
806 ctf_file_close (arg
->in_fp_parent
);
809 arg
->done_parent
= 1;
810 if (ctf_archive_iter (input
->clin_arc
, ctf_link_one_input_archive_member
,
812 ctf_err_warn (arg
->out_fp
, 0, 0, _("cannot traverse archive in input file "
813 "%s: link cannot continue"),
817 /* The only error indication to the caller is the errno: so ensure that it
818 is zero if there was no actual error from the caller. */
819 ctf_set_errno (arg
->out_fp
, 0);
821 ctf_file_close (arg
->in_fp_parent
);
824 ctf_link_close_one_input_archive (key
, value
, NULL
);
827 typedef struct link_sort_inputs_cb_arg
831 } link_sort_inputs_cb_arg_t
;
833 /* Sort the inputs by N (the link order). For CU-mapped links, this is a
834 mapping of input to output name, not a mapping of input name to input
835 ctf_link_input_t: compensate accordingly. */
837 ctf_link_sort_inputs (const ctf_next_hkv_t
*one
, const ctf_next_hkv_t
*two
,
840 ctf_link_input_t
*input_1
;
841 ctf_link_input_t
*input_2
;
842 link_sort_inputs_cb_arg_t
*cu_mapped
= (link_sort_inputs_cb_arg_t
*) arg
;
844 if (!cu_mapped
|| !cu_mapped
->is_cu_mapped
)
846 input_1
= (ctf_link_input_t
*) one
->hkv_value
;
847 input_2
= (ctf_link_input_t
*) two
->hkv_value
;
851 const char *name_1
= (const char *) one
->hkv_key
;
852 const char *name_2
= (const char *) two
->hkv_key
;
854 input_1
= ctf_dynhash_lookup (cu_mapped
->fp
->ctf_link_inputs
, name_1
);
855 input_2
= ctf_dynhash_lookup (cu_mapped
->fp
->ctf_link_inputs
, name_2
);
857 /* There is no guarantee that CU-mappings actually have corresponding
858 inputs: the relative ordering in that case is unimportant. */
865 if (input_1
->n
< input_2
->n
)
867 else if (input_1
->n
> input_2
->n
)
873 /* Count the number of input dicts in the ctf_link_inputs, or that subset of the
874 ctf_link_inputs given by CU_NAMES if set. Return the number of input dicts,
875 and optionally the name and ctf_link_input_t of the single input archive if
876 only one exists (no matter how many dicts it contains). */
878 ctf_link_deduplicating_count_inputs (ctf_file_t
*fp
, ctf_dynhash_t
*cu_names
,
879 ctf_link_input_t
**only_one_input
)
881 ctf_dynhash_t
*inputs
= fp
->ctf_link_inputs
;
882 ctf_next_t
*i
= NULL
;
884 ctf_link_input_t
*one_input
= NULL
;
885 const char *one_name
= NULL
;
886 ssize_t count
= 0, narcs
= 0;
892 while ((err
= ctf_dynhash_next (inputs
, &i
, &name
, &input
)) == 0)
896 one_name
= (const char *) name
;
897 /* If we are processing CU names, get the real input. */
899 one_input
= ctf_dynhash_lookup (fp
->ctf_link_inputs
, one_name
);
901 one_input
= (ctf_link_input_t
*) input
;
906 one_count
= ctf_link_lazy_open (fp
, one_input
);
910 ctf_next_destroy (i
);
911 return -1; /* errno is set for us. */
917 if (err
!= ECTF_NEXT_END
)
919 ctf_err_warn (fp
, 0, err
, _("iteration error counting deduplicating "
921 ctf_set_errno (fp
, err
);
931 *only_one_input
= one_input
;
933 else if (only_one_input
)
934 *only_one_input
= NULL
;
939 /* Allocate and populate an inputs array big enough for a given set of inputs:
940 either a specific set of CU names (those from that set found in the
941 ctf_link_inputs), or the entire ctf_link_inputs (if cu_names is not set).
942 The number of inputs (from ctf_link_deduplicating_count_inputs, above) is
943 passed in NINPUTS: an array of uint32_t containing parent pointers
944 (corresponding to those members of the inputs that have parents) is allocated
945 and returned in PARENTS.
947 The inputs are *archives*, not files: the archive can have multiple members
948 if it is the result of a previous incremental link. We want to add every one
949 in turn, including the shared parent. (The dedup machinery knows that a type
950 used by a single dictionary and its parent should not be shared in
951 CTF_LINK_SHARE_DUPLICATED mode.)
953 If no inputs exist that correspond to these CUs, return NULL with the errno
954 set to ECTF_NOCTFDATA. */
956 ctf_link_deduplicating_open_inputs (ctf_file_t
*fp
, ctf_dynhash_t
*cu_names
,
957 ssize_t ninputs
, uint32_t **parents
)
959 ctf_dynhash_t
*inputs
= fp
->ctf_link_inputs
;
960 ctf_next_t
*i
= NULL
;
962 link_sort_inputs_cb_arg_t sort_arg
;
963 ctf_file_t
**dedup_inputs
= NULL
;
965 uint32_t *parents_
= NULL
;
971 if ((dedup_inputs
= calloc (ninputs
, sizeof (ctf_file_t
*))) == NULL
)
974 if ((parents_
= calloc (ninputs
, sizeof (uint32_t))) == NULL
)
979 /* Counting done: push every input into the array, in the order they were
980 passed to ctf_link_add_ctf (and ultimately ld). */
982 sort_arg
.is_cu_mapped
= (cu_names
!= NULL
);
985 while ((err
= ctf_dynhash_next_sorted (inputs
, &i
, &name
, &input
,
986 ctf_link_sort_inputs
, &sort_arg
)) == 0)
988 const char *one_name
= (const char *) name
;
989 ctf_link_input_t
*one_input
;
991 ctf_file_t
*parent_fp
= NULL
;
993 ctf_next_t
*j
= NULL
;
995 /* If we are processing CU names, get the real input. All the inputs
996 will have been opened, if they contained any CTF at all. */
998 one_input
= ctf_dynhash_lookup (fp
->ctf_link_inputs
, one_name
);
1000 one_input
= (ctf_link_input_t
*) input
;
1002 if (!one_input
|| (!one_input
->clin_arc
&& !one_input
->clin_fp
))
1005 /* Short-circuit: if clin_fp is set, just use it. */
1006 if (one_input
->clin_fp
)
1008 parents_
[walk
- dedup_inputs
] = walk
- dedup_inputs
;
1009 *walk
= one_input
->clin_fp
;
1014 /* Get and insert the parent archive (if any), if this archive has
1015 multiple members. We assume, as elsewhere, that the parent is named
1018 if ((parent_fp
= ctf_arc_open_by_name (one_input
->clin_arc
,
1019 _CTF_SECTION
, &err
)) == NULL
)
1021 if (err
!= ECTF_NOMEMBNAM
)
1023 ctf_next_destroy (i
);
1024 ctf_set_errno (fp
, err
);
1031 parent_i
= walk
- dedup_inputs
;
1035 /* We disregard the input archive name: either it is the parent (which we
1036 already have), or we want to put everything into one TU sharing the
1037 cuname anyway (if this is a CU-mapped link), or this is the final phase
1038 of a relink with CU-mapping off (i.e. ld -r) in which case the cuname
1039 is correctly set regardless. */
1040 while ((one_fp
= ctf_archive_next (one_input
->clin_arc
, &j
, NULL
,
1043 if (one_fp
->ctf_flags
& LCTF_CHILD
)
1045 /* The contents of the parents array for elements not
1046 corresponding to children is undefined. If there is no parent
1047 (itself a sign of a likely linker bug or corrupt input), we set
1050 ctf_import (one_fp
, parent_fp
);
1052 parents_
[walk
- dedup_inputs
] = parent_i
;
1054 parents_
[walk
- dedup_inputs
] = walk
- dedup_inputs
;
1059 if (err
!= ECTF_NEXT_END
)
1061 ctf_next_destroy (i
);
1065 if (err
!= ECTF_NEXT_END
)
1068 *parents
= parents_
;
1070 return dedup_inputs
;
1076 ctf_set_errno (fp
, err
);
1079 free (dedup_inputs
);
1081 ctf_err_warn (fp
, 0, 0, _("error in deduplicating CTF link "
1082 "input allocation"));
1086 /* Close INPUTS that have already been linked, first the passed array, and then
1087 that subset of the ctf_link_inputs archives they came from cited by the
1088 CU_NAMES. If CU_NAMES is not specified, close all the ctf_link_inputs in one
1089 go, leaving it empty. */
1091 ctf_link_deduplicating_close_inputs (ctf_file_t
*fp
, ctf_dynhash_t
*cu_names
,
1092 ctf_file_t
**inputs
, ssize_t ninputs
)
1094 ctf_next_t
*it
= NULL
;
1099 /* This is the inverse of ctf_link_deduplicating_open_inputs: so first, close
1100 all the individual input dicts, opened by the archive iterator. */
1101 for (i
= 0; i
< ninputs
; i
++)
1102 ctf_file_close (inputs
[i
]);
1104 /* Now close the archives they are part of. */
1107 while ((err
= ctf_dynhash_next (cu_names
, &it
, &name
, NULL
)) == 0)
1109 /* Remove the input from the linker inputs, if it exists, which also
1112 ctf_dynhash_remove (fp
->ctf_link_inputs
, (const char *) name
);
1114 if (err
!= ECTF_NEXT_END
)
1116 ctf_err_warn (fp
, 0, err
, _("iteration error in deduplicating link "
1118 ctf_set_errno (fp
, err
);
1122 ctf_dynhash_empty (fp
->ctf_link_inputs
);
1127 /* Do a deduplicating link of all variables in the inputs. */
1129 ctf_link_deduplicating_variables (ctf_file_t
*fp
, ctf_file_t
**inputs
,
1130 size_t ninputs
, int cu_mapped
)
1132 ctf_link_in_member_cb_arg_t arg
;
1135 arg
.cu_mapped
= cu_mapped
;
1137 arg
.in_input_cu_file
= 0;
1139 for (i
= 0; i
< ninputs
; i
++)
1141 arg
.in_fp
= inputs
[i
];
1142 if (ctf_cuname (inputs
[i
]) != NULL
)
1143 arg
.in_file_name
= ctf_cuname (inputs
[i
]);
1145 arg
.in_file_name
= "unnamed-CU";
1146 arg
.cu_name
= arg
.in_file_name
;
1147 if (ctf_variable_iter (arg
.in_fp
, ctf_link_one_variable
, &arg
) < 0)
1148 return ctf_set_errno (fp
, ctf_errno (arg
.in_fp
));
1150 /* Outputs > 0 are per-CU. */
1151 arg
.in_input_cu_file
= 1;
1156 /* Do the per-CU part of a deduplicating link. */
1158 ctf_link_deduplicating_per_cu (ctf_file_t
*fp
)
1160 ctf_next_t
*i
= NULL
;
1165 /* Links with a per-CU mapping in force get a first pass of deduplication,
1166 dedupping the inputs for a given CU mapping into the output for that
1167 mapping. The outputs from this process get fed back into the final pass
1168 that is carried out even for non-CU links. */
1170 while ((err
= ctf_dynhash_next (fp
->ctf_link_out_cu_mapping
, &i
, &out_cu
,
1173 const char *out_name
= (const char *) out_cu
;
1174 ctf_dynhash_t
*in
= (ctf_dynhash_t
*) in_cus
;
1175 ctf_file_t
*out
= NULL
;
1176 ctf_file_t
**inputs
;
1177 ctf_file_t
**outputs
;
1178 ctf_archive_t
*in_arc
;
1180 ctf_link_input_t
*only_input
;
1184 if ((ninputs
= ctf_link_deduplicating_count_inputs (fp
, in
,
1185 &only_input
)) == -1)
1186 goto err_open_inputs
;
1188 /* CU mapping with no inputs? Skip. */
1192 if (labs ((long int) ninputs
) > 0xfffffffe)
1194 ctf_err_warn (fp
, 0, EFBIG
, _("too many inputs in deduplicating "
1195 "link: %li"), (long int) ninputs
);
1196 ctf_set_errno (fp
, EFBIG
);
1197 goto err_open_inputs
;
1200 /* Short-circuit: a cu-mapped link with only one input archive with
1201 unconflicting contents is a do-nothing, and we can just leave the input
1202 in place: we do have to change the cuname, though, so we unwrap it,
1203 change the cuname, then stuff it back in the linker input again, via
1204 the clin_fp short-circuit member. ctf_link_deduplicating_open_inputs
1205 will spot this member and jam it straight into the next link phase,
1206 ignoring the corresponding archive. */
1207 if (only_input
&& ninputs
== 1)
1209 ctf_next_t
*ai
= NULL
;
1212 /* We can abuse an archive iterator to get the only member cheaply, no
1213 matter what its name. */
1214 only_input
->clin_fp
= ctf_archive_next (only_input
->clin_arc
,
1215 &ai
, NULL
, 0, &err
);
1216 if (!only_input
->clin_fp
)
1218 ctf_err_warn (fp
, 0, err
, _("cannot open archive %s in "
1219 "CU-mapped CTF link"),
1220 only_input
->clin_filename
);
1221 ctf_set_errno (fp
, err
);
1222 goto err_open_inputs
;
1224 ctf_next_destroy (ai
);
1226 if (strcmp (only_input
->clin_filename
, out_name
) != 0)
1228 /* Renaming. We need to add a new input, then null out the
1229 clin_arc and clin_fp of the old one to stop it being
1230 auto-closed on removal. The new input needs its cuname changed
1231 to out_name, which is doable only because the cuname is a
1232 dynamic property which can be changed even in readonly
1235 ctf_cuname_set (only_input
->clin_fp
, out_name
);
1236 if (ctf_link_add_ctf_internal (fp
, only_input
->clin_arc
,
1237 only_input
->clin_fp
,
1240 ctf_err_warn (fp
, 0, 0, _("cannot add intermediate files "
1242 goto err_open_inputs
;
1244 only_input
->clin_arc
= NULL
;
1245 only_input
->clin_fp
= NULL
;
1246 ctf_dynhash_remove (fp
->ctf_link_inputs
,
1247 only_input
->clin_filename
);
1252 /* This is a real CU many-to-one mapping: we must dedup the inputs into
1253 a new output to be used in the final link phase. */
1255 if ((inputs
= ctf_link_deduplicating_open_inputs (fp
, in
, ninputs
,
1258 ctf_next_destroy (i
);
1262 if ((out
= ctf_create (&err
)) == NULL
)
1264 ctf_err_warn (fp
, 0, err
, _("cannot create per-CU CTF archive "
1267 ctf_set_errno (fp
, err
);
1271 /* Share the atoms table to reduce memory usage. */
1272 out
->ctf_dedup_atoms
= fp
->ctf_dedup_atoms_alloc
;
1274 /* No ctf_imports at this stage: this per-CU dictionary has no parents.
1275 Parent/child deduplication happens in the link's final pass. However,
1276 the cuname *is* important, as it is propagated into the final
1278 ctf_cuname_set (out
, out_name
);
1280 if (ctf_dedup (out
, inputs
, ninputs
, parents
, 1) < 0)
1282 ctf_set_errno (fp
, ctf_errno (out
));
1283 ctf_err_warn (fp
, 0, 0, _("CU-mapped deduplication failed for %s"),
1288 if ((outputs
= ctf_dedup_emit (out
, inputs
, ninputs
, parents
,
1289 &noutputs
, 1)) == NULL
)
1291 ctf_set_errno (fp
, ctf_errno (out
));
1292 ctf_err_warn (fp
, 0, 0, _("CU-mapped deduplicating link type emission "
1293 "failed for %s"), out_name
);
1296 if (!ctf_assert (fp
, noutputs
== 1))
1297 goto err_inputs_outputs
;
1299 if (!(fp
->ctf_link_flags
& CTF_LINK_OMIT_VARIABLES_SECTION
)
1300 && ctf_link_deduplicating_variables (out
, inputs
, ninputs
, 1) < 0)
1302 ctf_set_errno (fp
, ctf_errno (out
));
1303 ctf_err_warn (fp
, 0, 0, _("CU-mapped deduplicating link variable "
1304 "emission failed for %s"), out_name
);
1305 goto err_inputs_outputs
;
1308 if (ctf_link_deduplicating_close_inputs (fp
, in
, inputs
, ninputs
) < 0)
1317 /* Splice any errors or warnings created during this link back into the
1318 dict that the caller knows about. */
1319 ctf_list_splice (&fp
->ctf_errs_warnings
, &outputs
[0]->ctf_errs_warnings
);
1321 /* This output now becomes an input to the next link phase, with a name
1322 equal to the CU name. We have to wrap it in an archive wrapper
1325 if ((in_arc
= ctf_new_archive_internal (0, 0, NULL
, outputs
[0], NULL
,
1326 NULL
, &err
)) == NULL
)
1328 ctf_set_errno (fp
, err
);
1332 if (ctf_link_add_ctf_internal (fp
, in_arc
, NULL
,
1333 ctf_cuname (outputs
[0])) < 0)
1335 ctf_err_warn (fp
, 0, 0, _("cannot add intermediate files to link"));
1339 ctf_file_close (out
);
1344 ctf_list_splice (&fp
->ctf_errs_warnings
, &outputs
[0]->ctf_errs_warnings
);
1345 ctf_file_close (outputs
[0]);
1348 ctf_link_deduplicating_close_inputs (fp
, in
, inputs
, ninputs
);
1349 ctf_file_close (out
);
1353 ctf_next_destroy (i
);
1357 ctf_list_splice (&fp
->ctf_errs_warnings
, &outputs
[0]->ctf_errs_warnings
);
1358 ctf_file_close (outputs
[0]);
1360 ctf_next_destroy (i
);
1361 return -1; /* Errno is set for us. */
1363 if (err
!= ECTF_NEXT_END
)
1365 ctf_err_warn (fp
, 0, err
, _("iteration error in CU-mapped deduplicating "
1367 return ctf_set_errno (fp
, err
);
1373 /* Do a deduplicating link using the ctf-dedup machinery. */
1375 ctf_link_deduplicating (ctf_file_t
*fp
)
1378 ctf_file_t
**inputs
, **outputs
= NULL
;
1383 if (ctf_dedup_atoms_init (fp
) < 0)
1385 ctf_err_warn (fp
, 0, 0, _("allocating CTF dedup atoms table"));
1386 return; /* Errno is set for us. */
1389 if (fp
->ctf_link_out_cu_mapping
1390 && (ctf_link_deduplicating_per_cu (fp
) < 0))
1391 return; /* Errno is set for us. */
1393 if ((ninputs
= ctf_link_deduplicating_count_inputs (fp
, NULL
, NULL
)) < 0)
1394 return; /* Errno is set for us. */
1396 if ((inputs
= ctf_link_deduplicating_open_inputs (fp
, NULL
, ninputs
,
1398 return; /* Errno is set for us. */
1400 if (ninputs
== 1 && ctf_cuname (inputs
[0]) != NULL
)
1401 ctf_cuname_set (fp
, ctf_cuname (inputs
[0]));
1403 if (ctf_dedup (fp
, inputs
, ninputs
, parents
, 0) < 0)
1405 ctf_err_warn (fp
, 0, 0, _("deduplication failed for %s"),
1406 ctf_link_input_name (fp
));
1410 if ((outputs
= ctf_dedup_emit (fp
, inputs
, ninputs
, parents
, &noutputs
,
1413 ctf_err_warn (fp
, 0, 0, _("deduplicating link type emission failed "
1414 "for %s"), ctf_link_input_name (fp
));
1418 if (!ctf_assert (fp
, outputs
[0] == fp
))
1421 for (i
= 0; i
< noutputs
; i
++)
1425 /* We already have access to this one. Close the duplicate. */
1428 ctf_file_close (outputs
[0]);
1432 if ((dynname
= strdup (ctf_cuname (outputs
[i
]))) == NULL
)
1433 goto oom_one_output
;
1435 if (ctf_dynhash_insert (fp
->ctf_link_outputs
, dynname
, outputs
[i
]) < 0)
1436 goto oom_one_output
;
1441 ctf_set_errno (fp
, ENOMEM
);
1442 ctf_err_warn (fp
, 0, 0, _("out of memory allocating link outputs"));
1445 for (; i
< noutputs
; i
++)
1446 ctf_file_close (outputs
[i
]);
1450 if (!(fp
->ctf_link_flags
& CTF_LINK_OMIT_VARIABLES_SECTION
)
1451 && ctf_link_deduplicating_variables (fp
, inputs
, ninputs
, 0) < 0)
1453 ctf_err_warn (fp
, 0, 0, _("deduplicating link variable emission failed for "
1454 "%s"), ctf_link_input_name (fp
));
1455 for (i
= 1; i
< noutputs
; i
++)
1456 ctf_file_close (outputs
[i
]);
1460 /* Now close all the inputs, including per-CU intermediates. */
1462 if (ctf_link_deduplicating_close_inputs (fp
, NULL
, inputs
, ninputs
) < 0)
1463 return; /* errno is set for us. */
1465 ninputs
= 0; /* Prevent double-close. */
1466 ctf_set_errno (fp
, 0);
1471 for (i
= 0; i
< (size_t) ninputs
; i
++)
1472 ctf_file_close (inputs
[i
]);
1479 /* Merge types and variable sections in all files added to the link
1480 together. All the added files are closed. */
1482 ctf_link (ctf_file_t
*fp
, int flags
)
1484 ctf_link_in_member_cb_arg_t arg
;
1485 ctf_next_t
*i
= NULL
;
1488 memset (&arg
, 0, sizeof (struct ctf_link_in_member_cb_arg
));
1490 fp
->ctf_link_flags
= flags
;
1492 if (fp
->ctf_link_inputs
== NULL
)
1493 return 0; /* Nothing to do. */
1495 if (fp
->ctf_link_outputs
== NULL
)
1496 fp
->ctf_link_outputs
= ctf_dynhash_create (ctf_hash_string
,
1497 ctf_hash_eq_string
, free
,
1501 if (fp
->ctf_link_outputs
== NULL
)
1502 return ctf_set_errno (fp
, ENOMEM
);
1504 /* Create empty CUs if requested. We do not currently claim that multiple
1505 links in succession with CTF_LINK_EMPTY_CU_MAPPINGS set in some calls and
1506 not set in others will do anything especially sensible. */
1508 if (fp
->ctf_link_out_cu_mapping
&& (flags
& CTF_LINK_EMPTY_CU_MAPPINGS
))
1512 while ((err
= ctf_dynhash_next (fp
->ctf_link_out_cu_mapping
, &i
, &v
,
1515 const char *to
= (const char *) v
;
1516 if (ctf_create_per_cu (fp
, to
, to
) == NULL
)
1518 ctf_next_destroy (i
);
1519 return -1; /* Errno is set for us. */
1522 if (err
!= ECTF_NEXT_END
)
1524 ctf_err_warn (fp
, 1, err
, _("iteration error creating empty CUs"));
1525 ctf_set_errno (fp
, err
);
1530 if ((flags
& CTF_LINK_NONDEDUP
) || (getenv ("LD_NO_CTF_DEDUP")))
1531 ctf_dynhash_iter (fp
->ctf_link_inputs
, ctf_link_one_input_archive
,
1534 ctf_link_deduplicating (fp
);
1536 /* Discard the now-unnecessary mapping table data from all the outputs. */
1537 if (fp
->ctf_link_type_mapping
)
1538 ctf_dynhash_empty (fp
->ctf_link_type_mapping
);
1539 ctf_dynhash_iter (fp
->ctf_link_outputs
, empty_link_type_mapping
, NULL
);
1541 if ((ctf_errno (fp
) != 0) && (ctf_errno (fp
) != ECTF_NOCTFDATA
))
1546 typedef struct ctf_link_out_string_cb_arg
1551 } ctf_link_out_string_cb_arg_t
;
1553 /* Intern a string in the string table of an output per-CU CTF file. */
1555 ctf_link_intern_extern_string (void *key _libctf_unused_
, void *value
,
1558 ctf_file_t
*fp
= (ctf_file_t
*) value
;
1559 ctf_link_out_string_cb_arg_t
*arg
= (ctf_link_out_string_cb_arg_t
*) arg_
;
1561 fp
->ctf_flags
|= LCTF_DIRTY
;
1562 if (!ctf_str_add_external (fp
, arg
->str
, arg
->offset
))
1566 /* Repeatedly call ADD_STRING to acquire strings from the external string table,
1567 adding them to the atoms table for this CU and all subsidiary CUs.
1569 If ctf_link() is also called, it must be called first if you want the new CTF
1570 files ctf_link() can create to get their strings dedupped against the ELF
1573 ctf_link_add_strtab (ctf_file_t
*fp
, ctf_link_strtab_string_f
*add_string
,
1580 while ((str
= add_string (&offset
, arg
)) != NULL
)
1582 ctf_link_out_string_cb_arg_t iter_arg
= { str
, offset
, 0 };
1584 fp
->ctf_flags
|= LCTF_DIRTY
;
1585 if (!ctf_str_add_external (fp
, str
, offset
))
1588 ctf_dynhash_iter (fp
->ctf_link_outputs
, ctf_link_intern_extern_string
,
1597 /* Not yet implemented. */
1599 ctf_link_shuffle_syms (ctf_file_t
*fp _libctf_unused_
,
1600 ctf_link_iter_symbol_f
*add_sym _libctf_unused_
,
1601 void *arg _libctf_unused_
)
1606 typedef struct ctf_name_list_accum_cb_arg
1614 } ctf_name_list_accum_cb_arg_t
;
1616 /* Accumulate the names and a count of the names in the link output hash. */
1618 ctf_accumulate_archive_names (void *key
, void *value
, void *arg_
)
1620 const char *name
= (const char *) key
;
1621 ctf_file_t
*fp
= (ctf_file_t
*) value
;
1624 ctf_name_list_accum_cb_arg_t
*arg
= (ctf_name_list_accum_cb_arg_t
*) arg_
;
1626 if ((names
= realloc (arg
->names
, sizeof (char *) * ++(arg
->i
))) == NULL
)
1629 ctf_set_errno (arg
->fp
, ENOMEM
);
1633 if ((files
= realloc (arg
->files
, sizeof (ctf_file_t
*) * arg
->i
)) == NULL
)
1636 ctf_set_errno (arg
->fp
, ENOMEM
);
1640 /* Allow the caller to get in and modify the name at the last minute. If the
1641 caller *does* modify the name, we have to stash away the new name the
1642 caller returned so we can free it later on. (The original name is the key
1643 of the ctf_link_outputs hash and is freed by the dynhash machinery.) */
1645 if (fp
->ctf_link_memb_name_changer
)
1649 void *nc_arg
= fp
->ctf_link_memb_name_changer_arg
;
1651 dyname
= fp
->ctf_link_memb_name_changer (fp
, name
, nc_arg
);
1655 if ((dynames
= realloc (arg
->dynames
,
1656 sizeof (char *) * ++(arg
->ndynames
))) == NULL
)
1659 ctf_set_errno (arg
->fp
, ENOMEM
);
1662 arg
->dynames
= dynames
;
1663 name
= (const char *) dyname
;
1668 arg
->names
[(arg
->i
) - 1] = (char *) name
;
1670 arg
->files
[(arg
->i
) - 1] = fp
;
1673 /* Change the name of the parent CTF section, if the name transformer has got to
1676 ctf_change_parent_name (void *key _libctf_unused_
, void *value
, void *arg
)
1678 ctf_file_t
*fp
= (ctf_file_t
*) value
;
1679 const char *name
= (const char *) arg
;
1681 ctf_parent_name_set (fp
, name
);
1684 /* Write out a CTF archive (if there are per-CU CTF files) or a CTF file
1685 (otherwise) into a new dynamically-allocated string, and return it.
1686 Members with sizes above THRESHOLD are compressed. */
1688 ctf_link_write (ctf_file_t
*fp
, size_t *size
, size_t threshold
)
1690 ctf_name_list_accum_cb_arg_t arg
;
1692 char *transformed_name
= NULL
;
1698 unsigned char *buf
= NULL
;
1700 memset (&arg
, 0, sizeof (ctf_name_list_accum_cb_arg_t
));
1703 if (fp
->ctf_link_outputs
)
1705 ctf_dynhash_iter (fp
->ctf_link_outputs
, ctf_accumulate_archive_names
, &arg
);
1706 if (ctf_errno (fp
) < 0)
1708 errloc
= "hash creation";
1713 /* No extra outputs? Just write a simple ctf_file_t. */
1715 return ctf_write_mem (fp
, size
, threshold
);
1717 /* Writing an archive. Stick ourselves (the shared repository, parent of all
1718 other archives) on the front of it with the default name. */
1719 if ((names
= realloc (arg
.names
, sizeof (char *) * (arg
.i
+ 1))) == NULL
)
1721 errloc
= "name reallocation";
1725 memmove (&(arg
.names
[1]), arg
.names
, sizeof (char *) * (arg
.i
));
1727 arg
.names
[0] = (char *) _CTF_SECTION
;
1728 if (fp
->ctf_link_memb_name_changer
)
1730 void *nc_arg
= fp
->ctf_link_memb_name_changer_arg
;
1732 transformed_name
= fp
->ctf_link_memb_name_changer (fp
, _CTF_SECTION
,
1735 if (transformed_name
!= NULL
)
1737 arg
.names
[0] = transformed_name
;
1738 ctf_dynhash_iter (fp
->ctf_link_outputs
, ctf_change_parent_name
,
1743 if ((files
= realloc (arg
.files
,
1744 sizeof (struct ctf_file
*) * (arg
.i
+ 1))) == NULL
)
1746 errloc
= "ctf_file reallocation";
1750 memmove (&(arg
.files
[1]), arg
.files
, sizeof (ctf_file_t
*) * (arg
.i
));
1753 if ((f
= tmpfile ()) == NULL
)
1755 errloc
= "tempfile creation";
1759 if ((err
= ctf_arc_write_fd (fileno (f
), arg
.files
, arg
.i
+ 1,
1760 (const char **) arg
.names
,
1763 errloc
= "archive writing";
1764 ctf_set_errno (fp
, err
);
1768 if (fseek (f
, 0, SEEK_END
) < 0)
1770 errloc
= "seeking to end";
1774 if ((fsize
= ftell (f
)) < 0)
1776 errloc
= "filesize determination";
1780 if (fseek (f
, 0, SEEK_SET
) < 0)
1782 errloc
= "filepos resetting";
1786 if ((buf
= malloc (fsize
)) == NULL
)
1788 errloc
= "CTF archive buffer allocation";
1792 while (!feof (f
) && fread (buf
, fsize
, 1, f
) == 0)
1795 errloc
= "reading archive from temporary file";
1802 free (transformed_name
);
1806 for (i
= 0; i
< arg
.ndynames
; i
++)
1807 free (arg
.dynames
[i
]);
1814 ctf_set_errno (fp
, errno
);
1821 free (transformed_name
);
1825 for (i
= 0; i
< arg
.ndynames
; i
++)
1826 free (arg
.dynames
[i
]);
1829 ctf_err_warn (fp
, 0, 0, _("cannot write archive in link: %s failure"),