]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
libctf: do not deduplicate strings in the header
authorNick Alcock <nick.alcock@oracle.com>
Mon, 15 Jul 2024 21:08:10 +0000 (22:08 +0100)
committerNick Alcock <nick.alcock@oracle.com>
Thu, 30 Oct 2025 14:17:51 +0000 (14:17 +0000)
It is unreasonable to expect users to ctf_import the parent before being
able to understand the header -- doubly so because the only string in the
header which is likely to be deduplicable is the parent name, which is the
same in every child, yet without the parent name being *available* in the
child's strtab you cannot call ctf_parent_name to figure out which parent
to import!

libctf/
* ctf-serialize.c (ctf_preserialize): Prevent deduplication of header string
        fields.
* ctf-open.c (ctf_set_base): Note this.
* ctf-string.c (ctf_str_free_atom): Likewise.

libctf/ctf-open.c
libctf/ctf-serialize.c
libctf/ctf-string.c

index fb493925118cbce334d4d4fe1f5df2031105b071..5773fc34e2dc3b142829f7c054be707643864088 100644 (file)
@@ -364,7 +364,12 @@ ctf_set_base (ctf_dict_t *fp, const ctf_header_t *hp, unsigned char *base)
 
   /* Note: before conversion, these will be set to values that will be
      immediately invalidated by the conversion process, but the conversion
-     process will call ctf_set_base() again to fix things up.  */
+     process will call ctf_set_base() again to fix things up.
+
+     These labels are explicitly constrained from being deduplicated (even though
+     .ctf is usually a duplicated name), because they are the key to identifying
+     the parent dict (and determining that this dict is a child) in the first
+     place.  */
 
   if (hp->cth_parlabel != 0)
     fp->ctf_parlabel = ctf_strptr (fp, hp->cth_parlabel);
index df7f7938fb372b21466d722a53dd35abfcb12baa..c2292ee78c36c4d51ec61ac4a4b8fc32303537ee 100644 (file)
@@ -1054,9 +1054,9 @@ ctf_preserialize (ctf_dict_t *fp)
 
   hdrp = (ctf_header_t *) buf;
   if ((fp->ctf_flags & LCTF_CHILD) && (fp->ctf_parname != NULL))
-    ctf_str_add_ref (fp, fp->ctf_parname, &hdrp->cth_parname);
+    ctf_str_add_no_dedup_ref (fp, fp->ctf_parname, &hdrp->cth_parname);
   if (fp->ctf_cuname != NULL)
-    ctf_str_add_ref (fp, fp->ctf_cuname, &hdrp->cth_cuname);
+    ctf_str_add_no_dedup_ref (fp, fp->ctf_cuname, &hdrp->cth_cuname);
 
   if (ctf_emit_symtypetab_sects (fp, &symstate, &t, objt_size, func_size,
                                 objtidx_size, funcidx_size) < 0)
index dc72555c38f0096deb774544e0f8fbfd34f5a114..f171f12b49431ad85e21fe171a952b8524e2159d 100644 (file)
@@ -202,7 +202,9 @@ ctf_str_free_atom (void *a)
    pulled in.)
 
    Note that the *final strtab* may be entirely empty, if all its strings are
-   shared with the parent: the atoms table is a superset.  */
+   shared with the parent: the atoms table is a superset.  (But this will never
+   happen in practice, because some header fields are explicitly never
+   deduplicated.)  */
 int
 ctf_str_create_atoms (ctf_dict_t *fp)
 {