summaryrefslogtreecommitdiff
path: root/libctf
diff options
context:
space:
mode:
authorNick Alcock <nick.alcock@oracle.com>2021-09-27 20:31:21 +0100
committerNick Alcock <nick.alcock@oracle.com>2021-09-27 20:31:25 +0100
commitb62d5edd0a5794a6ba142ed66dbba366546dc307 (patch)
tree8b0136f8c17bafda082c6dc66677b1e7ac16a10a /libctf
parentb9004024b9c0af433952551e3317c6382a7bede3 (diff)
libctf: fix handling of CTF symtypetab sections emitted by older GCC
Older (pre-upstreaming) GCC emits a function symtypetab section of a format never read by any extant libctf. We can detect such CTF dicts by the lack of the CTF_F_NEWFUNCINFO flag in their header, and we do so when reading in the symtypetab section -- but if the set of symbols with types is sufficiently sparse, even an older GCC will emit a function index section. In NEWFUNCINFO-capable compilers, this section will always be the exact same length as the corresponding function section (each is an array of uint32_t, associated 1:1 with each other). But this is not true for the older compiler, for which the sections are different lengths. We check to see if the function symtypetab section and its index are the same length, but we fail to skip this check when this is not a NEWFUNCINFO dict, and emit a spurious corruption error for a CTF dict we could have perfectly well opened and used. Fix trivial: check the flag (and fix the terrible grammar of the error message at the same time). libctf/ChangeLog 2021-09-27 Nick Alcock <nick.alcock@oracle.com> * ctf-open.c (ctf_bufopen_internal): Don't complain about corrupt function index symtypetab sections if this is an old-format function symtypetab section (which should be ignored in any case). Fix bad grammar.
Diffstat (limited to 'libctf')
-rw-r--r--libctf/ChangeLog7
-rw-r--r--libctf/ctf-open.c7
2 files changed, 11 insertions, 3 deletions
diff --git a/libctf/ChangeLog b/libctf/ChangeLog
index 5294cae1e6..66423cfa48 100644
--- a/libctf/ChangeLog
+++ b/libctf/ChangeLog
@@ -1,5 +1,12 @@
2021-09-27 Nick Alcock <nick.alcock@oracle.com>
+ * ctf-open.c (ctf_bufopen_internal): Don't complain about corrupt
+ function index symtypetab sections if this is an old-format
+ function symtypetab section (which should be ignored in any case).
+ Fix bad grammar.
+
+2021-09-27 Nick Alcock <nick.alcock@oracle.com>
+
* configure: Regenerate.
* Makefile.in: Regenerate.
diff --git a/libctf/ctf-open.c b/libctf/ctf-open.c
index 9e2c57051a..caeff06425 100644
--- a/libctf/ctf-open.c
+++ b/libctf/ctf-open.c
@@ -1449,7 +1449,7 @@ ctf_bufopen_internal (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
!= hp->cth_funcoff - hp->cth_objtoff))
{
ctf_err_warn (NULL, 0, ECTF_CORRUPT,
- _("Object index section exists is neither empty nor the "
+ _("Object index section is neither empty nor the "
"same length as the object section: %u versus %u "
"bytes"), hp->cth_funcoff - hp->cth_objtoff,
hp->cth_funcidxoff - hp->cth_objtidxoff);
@@ -1458,10 +1458,11 @@ ctf_bufopen_internal (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
if ((hp->cth_varoff - hp->cth_funcidxoff != 0) &&
(hp->cth_varoff - hp->cth_funcidxoff
- != hp->cth_objtidxoff - hp->cth_funcoff))
+ != hp->cth_objtidxoff - hp->cth_funcoff) &&
+ (hp->cth_flags & CTF_F_NEWFUNCINFO))
{
ctf_err_warn (NULL, 0, ECTF_CORRUPT,
- _("Function index section exists is neither empty nor the "
+ _("Function index section is neither empty nor the "
"same length as the function section: %u versus %u "
"bytes"), hp->cth_objtidxoff - hp->cth_funcoff,
hp->cth_varoff - hp->cth_funcidxoff);