diff options
author | Alan Modra <amodra@gmail.com> | 2025-02-28 17:56:48 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2025-03-04 08:23:16 +1030 |
commit | a8a9fc74297636d8e6502c090d51f46f82aae1ea (patch) | |
tree | c016bbacdc1c525aec098dea77894ca5442f20a4 /binutils | |
parent | 7166166ec098b998dbd48e90be40ce880f7d46de (diff) | |
download | binutils-a8a9fc74297636d8e6502c090d51f46f82aae1ea.zip binutils-a8a9fc74297636d8e6502c090d51f46f82aae1ea.tar.gz binutils-a8a9fc74297636d8e6502c090d51f46f82aae1ea.tar.bz2 |
objdump: is_same_section
This fixes a deficiency in commit 660df28acfa1, which should have used
the same logic as that in sym_ok. Ideally both places would not
compare section names, but it can be a little tricky to match a
section in the real object file with a section in a debug file.
Extend commit 39f0547e554d to use section name, vma and size.
* objcopy (is_same_section): New function.
(compare_symbols, sym_ok): Use it here.
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/objdump.c | 51 |
1 files changed, 27 insertions, 24 deletions
diff --git a/binutils/objdump.c b/binutils/objdump.c index bbc34ed..e7b053c 100644 --- a/binutils/objdump.c +++ b/binutils/objdump.c @@ -1107,6 +1107,28 @@ remove_useless_symbols (asymbol **symbols, long count) return out_ptr - symbols; } +/* Return true iff SEC1 and SEC2 are the same section. + This would just be a simple pointer comparison except that one of + the sections might be from a separate debug info file. */ + +static bool +is_same_section (const asection *sec1, const asection *sec2) +{ + if (sec1 == sec2) + return true; + if (sec1->owner == sec2->owner + || sec1->owner == NULL + || sec2->owner == NULL) + return false; + /* OK, so we have one section in a debug info file. (Or they both + are, but the way this function is currently used sec1 will be in + a normal object.) Compare names, vma and size. This ought to + cover all the usual cases. */ + return (sec1->vma == sec2->vma + && sec1->size == sec2->size + && strcmp (sec1->name, sec2->name) == 0); +} + static const asection *compare_section; /* Sort symbols into value order. */ @@ -1131,10 +1153,9 @@ compare_symbols (const void *ap, const void *bp) /* Prefer symbols from the section currently being disassembled. Don't sort symbols from other sections by section, since there - isn't much reason to prefer one section over another otherwise. - See sym_ok comment for why we compare by section name. */ - as = strcmp (compare_section->name, a->section->name) == 0; - bs = strcmp (compare_section->name, b->section->name) == 0; + isn't much reason to prefer one section over another otherwise. */ + as = is_same_section (compare_section, a->section); + bs = is_same_section (compare_section, b->section); if (as && !bs) return -1; if (!as && bs) @@ -1353,26 +1374,8 @@ sym_ok (bool want_section, asection *sec, struct disassemble_info *inf) { - if (want_section) - { - /* NB: An object file can have different sections with the same - section name. Compare compare section pointers if they have - the same owner. */ - if (sorted_syms[place]->section->owner == sec->owner - && sorted_syms[place]->section != sec) - return false; - - /* Note - we cannot just compare section pointers because they could - be different, but the same... Ie the symbol that we are trying to - find could have come from a separate debug info file. Under such - circumstances the symbol will be associated with a section in the - debug info file, whilst the section we want is in a normal file. - So the section pointers will be different, but the section names - will be the same. */ - if (strcmp (bfd_section_name (sorted_syms[place]->section), - bfd_section_name (sec)) != 0) - return false; - } + if (want_section && !is_same_section (sec, sorted_syms[place]->section)) + return false; return inf->symbol_is_valid (sorted_syms[place], inf); } |