From 208599d928a42813e1e64e7b1fe318b84d7eb351 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 15 Feb 2021 12:04:11 +1030 Subject: 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. --- binutils/objdump.c | 85 +++++++++++++++++++----------------------------------- 1 file changed, 29 insertions(+), 56 deletions(-) (limited to 'binutils/objdump.c') diff --git a/binutils/objdump.c b/binutils/objdump.c index 3047850..47b2309 100644 --- a/binutils/objdump.c +++ b/binutils/objdump.c @@ -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; - - relocs = (arelent **) xmalloc (reloc_size); + long reloc_size = bfd_get_reloc_upper_bound (abfd, sec); - 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; -- cgit v1.1