objdump: don't cache section contents in load_specific_debug_section
* objdump.c (load_specific_debug_section): Don't call bfd_cache_section_contents. Rearrange so that bfd_get_full_section_contents is not called on path where bfd_simple_get_relocated_section_contents is called. Don't set section->user_data. (free_debug_section): Always free section->start. Don't twiddle section flags. * readelf.c (load_specific_debug_section): Don't set user_data. * dwarf.h (struct dwarf_section): Remove use_data field. * dwarf.c (NO_ABBREVS, ABBREV): Adjust to suit.
This commit is contained in:
parent
1781a9d0f3
commit
208599d928
5 changed files with 44 additions and 61 deletions
|
@ -1,3 +1,16 @@
|
|||
2021-02-15 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* objdump.c (load_specific_debug_section): Don't call
|
||||
bfd_cache_section_contents. Rearrange so that
|
||||
bfd_get_full_section_contents is not called on path where
|
||||
bfd_simple_get_relocated_section_contents is called.
|
||||
Don't set section->user_data.
|
||||
(free_debug_section): Always free section->start. Don't twiddle
|
||||
section flags.
|
||||
* readelf.c (load_specific_debug_section): Don't set user_data.
|
||||
* dwarf.h (struct dwarf_section): Remove use_data field.
|
||||
* dwarf.c (NO_ABBREVS, ABBREV): Adjust to suit.
|
||||
|
||||
2021-02-15 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* testsuite/binutils-all/compress.exp: Remove nds32 xfails.
|
||||
|
|
|
@ -11491,8 +11491,8 @@ dwarf_select_sections_all (void)
|
|||
do_debug_str_offsets = 1;
|
||||
}
|
||||
|
||||
#define NO_ABBREVS NULL, NULL, NULL, 0, 0, 0, NULL, 0, NULL
|
||||
#define ABBREV(N) NULL, NULL, NULL, 0, 0, N, NULL, 0, NULL
|
||||
#define NO_ABBREVS NULL, NULL, NULL, 0, 0, 0, NULL, 0
|
||||
#define ABBREV(N) NULL, NULL, NULL, 0, 0, N, NULL, 0
|
||||
|
||||
/* N.B. The order here must match the order in section_display_enum. */
|
||||
|
||||
|
|
|
@ -143,8 +143,6 @@ struct dwarf_section
|
|||
/* Used by clients to help them implement the reloc_at callback. */
|
||||
void * reloc_info;
|
||||
unsigned long num_relocs;
|
||||
/* A spare field for random use. */
|
||||
void * user_data;
|
||||
};
|
||||
|
||||
/* A structure containing the name of a debug section
|
||||
|
|
|
@ -3552,6 +3552,7 @@ load_specific_debug_section (enum dwarf_section_display_enum debug,
|
|||
bfd_byte *contents;
|
||||
bfd_size_type amt;
|
||||
size_t alloced;
|
||||
bfd_boolean ret;
|
||||
|
||||
if (section->start != NULL)
|
||||
{
|
||||
|
@ -3565,7 +3566,6 @@ load_specific_debug_section (enum dwarf_section_display_enum debug,
|
|||
section->reloc_info = NULL;
|
||||
section->num_relocs = 0;
|
||||
section->address = bfd_section_vma (sec);
|
||||
section->user_data = sec;
|
||||
section->size = bfd_section_size (sec);
|
||||
/* PR 24360: On 32-bit hosts sizeof (size_t) < sizeof (bfd_size_type). */
|
||||
alloced = amt = section->size + 1;
|
||||
|
@ -3578,57 +3578,50 @@ load_specific_debug_section (enum dwarf_section_display_enum debug,
|
|||
(unsigned long long) section->size);
|
||||
return FALSE;
|
||||
}
|
||||
section->start = contents = malloc (alloced);
|
||||
if (section->start == NULL
|
||||
|| !bfd_get_full_section_contents (abfd, sec, &contents))
|
||||
{
|
||||
free_debug_section (debug);
|
||||
printf (_("\nCan't get contents for section '%s'.\n"),
|
||||
sanitize_string (section->name));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
section->start = contents = xmalloc (alloced);
|
||||
/* Ensure any string section has a terminating NUL. */
|
||||
section->start[section->size] = 0;
|
||||
|
||||
if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0
|
||||
&& debug_displays [debug].relocate)
|
||||
{
|
||||
long reloc_size;
|
||||
bfd_boolean ret;
|
||||
|
||||
bfd_cache_section_contents (sec, section->start);
|
||||
|
||||
ret = bfd_simple_get_relocated_section_contents (abfd,
|
||||
sec,
|
||||
section->start,
|
||||
syms) != NULL;
|
||||
|
||||
if (! ret)
|
||||
{
|
||||
free_debug_section (debug);
|
||||
printf (_("\nCan't get contents for section '%s'.\n"),
|
||||
sanitize_string (section->name));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
reloc_size = bfd_get_reloc_upper_bound (abfd, sec);
|
||||
if (reloc_size > 0)
|
||||
if (ret)
|
||||
{
|
||||
unsigned long reloc_count;
|
||||
arelent **relocs;
|
||||
long reloc_size = bfd_get_reloc_upper_bound (abfd, sec);
|
||||
|
||||
relocs = (arelent **) xmalloc (reloc_size);
|
||||
|
||||
reloc_count = bfd_canonicalize_reloc (abfd, sec, relocs, NULL);
|
||||
if (reloc_count == 0)
|
||||
free (relocs);
|
||||
else
|
||||
if (reloc_size > 0)
|
||||
{
|
||||
section->reloc_info = relocs;
|
||||
section->num_relocs = reloc_count;
|
||||
unsigned long reloc_count;
|
||||
arelent **relocs;
|
||||
|
||||
relocs = (arelent **) xmalloc (reloc_size);
|
||||
|
||||
reloc_count = bfd_canonicalize_reloc (abfd, sec, relocs, NULL);
|
||||
if (reloc_count == 0)
|
||||
free (relocs);
|
||||
else
|
||||
{
|
||||
section->reloc_info = relocs;
|
||||
section->num_relocs = reloc_count;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
ret = bfd_get_full_section_contents (abfd, sec, &contents);
|
||||
|
||||
if (!ret)
|
||||
{
|
||||
free_debug_section (debug);
|
||||
printf (_("\nCan't get contents for section '%s'.\n"),
|
||||
sanitize_string (section->name));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -3686,26 +3679,6 @@ free_debug_section (enum dwarf_section_display_enum debug)
|
|||
{
|
||||
struct dwarf_section *section = &debug_displays [debug].section;
|
||||
|
||||
if (section->start == NULL)
|
||||
return;
|
||||
|
||||
/* PR 17512: file: 0f67f69d. */
|
||||
if (section->user_data != NULL)
|
||||
{
|
||||
asection * sec = (asection *) section->user_data;
|
||||
|
||||
/* If we are freeing contents that are also pointed to by the BFD
|
||||
library's section structure then make sure to update those pointers
|
||||
too. Otherwise, the next time we try to load data for this section
|
||||
we can end up using a stale pointer. */
|
||||
if (section->start == sec->contents)
|
||||
{
|
||||
sec->contents = NULL;
|
||||
sec->flags &= ~ SEC_IN_MEMORY;
|
||||
sec->compress_status = COMPRESS_SECTION_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
free ((char *) section->start);
|
||||
section->start = NULL;
|
||||
section->address = 0;
|
||||
|
|
|
@ -14898,7 +14898,6 @@ load_specific_debug_section (enum dwarf_section_display_enum debug,
|
|||
|
||||
snprintf (buf, sizeof (buf), _("%s section data"), section->name);
|
||||
section->address = sec->sh_addr;
|
||||
section->user_data = NULL;
|
||||
section->filename = filedata->file_name;
|
||||
section->start = (unsigned char *) get_data (NULL, filedata,
|
||||
sec->sh_offset, 1,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue