libctf, open: fix opening CTF in binaries with no symtab
This is a perfectly possible case, and half of ctf_bfdopen_ctfsect handled it fine. The other half hit a divide by zero or two before we got that far, and had no code path to load the strtab from anywhere in the absence of a symtab to point at it in any case. So, as a fallback, if there is no symtab, try loading ".strtab" explicitly by name, like we used to before we started looking for the strtab the symtab used. Of course, such a strtab is not kept hold of by BFD, so this means we have to bring back the code to possibly explicitly free the strtab that we read in. libctf/ * ctf-impl.h (struct ctf_archive_internal) <ctfi_free_strsect> New. * ctf-open-bfd.c (ctf_bfdopen_ctfsect): Explicitly open a strtab if the input has no symtab, rather than dividing by zero. Arrange to free it later via ctfi_free_ctfsect. * ctf-archive.c (ctf_new_archive_internal): Do not ctfi_free_strsect by default. (ctf_arc_close): Possibly free it here.
This commit is contained in:
parent
7044740174
commit
d50c08025d
4 changed files with 73 additions and 29 deletions
|
@ -368,6 +368,7 @@ ctf_new_archive_internal (int is_archive, int unmap_on_close,
|
|||
if (strsect)
|
||||
memcpy (&arci->ctfi_strsect, strsect, sizeof (struct ctf_sect));
|
||||
arci->ctfi_free_symsect = 0;
|
||||
arci->ctfi_free_strsect = 0;
|
||||
arci->ctfi_unmap_on_close = unmap_on_close;
|
||||
|
||||
return arci;
|
||||
|
@ -493,6 +494,8 @@ ctf_arc_close (ctf_archive_t *arc)
|
|||
ctf_file_close (arc->ctfi_file);
|
||||
if (arc->ctfi_free_symsect)
|
||||
free ((void *) arc->ctfi_symsect.cts_data);
|
||||
if (arc->ctfi_free_strsect)
|
||||
free ((void *) arc->ctfi_strsect.cts_data);
|
||||
free (arc->ctfi_data);
|
||||
if (arc->ctfi_bfd_close)
|
||||
arc->ctfi_bfd_close (arc);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue