From 9ec8e6a0023bc8f4c2b31f42c590de8a68699747 Mon Sep 17 00:00:00 2001 From: Jim Blandy Date: Fri, 31 Aug 2001 00:40:45 +0000 Subject: [PATCH] * symfile.c (sections_overlap): New function. (map_overlay_command): Call sections_overlap, instead of using incorrect logic to recognize overlapping sections. --- gdb/ChangeLog | 4 ++++ gdb/symfile.c | 25 ++++++++++++++++++++----- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 49fe5c49e18..2685dd2666c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,9 @@ 2001-08-30 Jim Blandy + * symfile.c (sections_overlap): New function. + (map_overlay_command): Call sections_overlap, instead of using + incorrect logic to recognize overlapping sections. + * symfile.c (load_command): Invalidate the overlay cache. 2001-08-30 Mark Kettenis diff --git a/gdb/symfile.c b/gdb/symfile.c index 1bda72eb366..7f3fdc643f3 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -2490,6 +2490,7 @@ init_psymbol_list (struct objfile *objfile, int total_symbols) section_is_overlay(sect): true if section's VMA != LMA pc_in_mapped_range(pc,sec): true if pc belongs to section's VMA pc_in_unmapped_range(...): true if pc belongs to section's LMA + sections_overlap(sec1, sec2): true if mapped sec1 and sec2 ranges overlap overlay_mapped_address(...): map an address from section's LMA to VMA overlay_unmapped_address(...): map an address from section's VMA to LMA symbol_overlayed_address(...): Return a "current" address for symbol: @@ -2629,6 +2630,20 @@ pc_in_mapped_range (CORE_ADDR pc, asection *section) return 0; } + +/* Return true if the mapped ranges of sections A and B overlap, false + otherwise. */ +int +sections_overlap (asection *a, asection *b) +{ + CORE_ADDR a_start = a->vma; + CORE_ADDR a_end = a->vma + bfd_get_section_size_before_reloc (a); + CORE_ADDR b_start = b->vma; + CORE_ADDR b_end = b->vma + bfd_get_section_size_before_reloc (b); + + return (a_start < b_end && b_start < a_end); +} + /* Function: overlay_unmapped_address (PC, SECTION) Returns the address corresponding to PC in the unmapped (load) range. May be the same as PC. */ @@ -2807,11 +2822,11 @@ the 'overlay manual' command."); /* Next, make a pass and unmap any sections that are overlapped by this new section: */ ALL_OBJSECTIONS (objfile2, sec2) - if (sec2->ovly_mapped && - sec != sec2 && - sec->the_bfd_section != sec2->the_bfd_section && - (pc_in_mapped_range (sec2->addr, sec->the_bfd_section) || - pc_in_mapped_range (sec2->endaddr, sec->the_bfd_section))) + if (sec2->ovly_mapped + && sec != sec2 + && sec->the_bfd_section != sec2->the_bfd_section + && sections_overlap (sec->the_bfd_section, + sec2->the_bfd_section)) { if (info_verbose) printf_filtered ("Note: section %s unmapped by overlap\n", -- 2.30.2