diff options
author | Alan Modra <amodra@gmail.com> | 2023-07-21 16:57:18 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2023-07-26 10:23:27 +0930 |
commit | eb14a8b4bfb767beebfb54d7911da4132b5c0f94 (patch) | |
tree | 09953b7f145bdd9c8c58dbfd1b2824a87efc4ea5 /gold/object.cc | |
parent | 0d8e39f5ce5530cf548ca8a70ff19a34991e43cb (diff) | |
download | gdb-eb14a8b4bfb767beebfb54d7911da4132b5c0f94.zip gdb-eb14a8b4bfb767beebfb54d7911da4132b5c0f94.tar.gz gdb-eb14a8b4bfb767beebfb54d7911da4132b5c0f94.tar.bz2 |
[GOLD] reporting local symbol names
get_symbol_name currently returns "" for the usual STT_SECTION symbols
generated by gas. That's not very helpful, return the section name.
Demangle local symbols too, fixing an inconsistency in
issue_discarded_error where global symbols are demangled.
* object.cc (Sized_relobj_file::get_symbol_name): Return a
std::string. Return section name for STT_SECTION symbols with
zero st_name. Sanity check st_name, and don't run off the end
of an improperly terminated .strtab. Demangle sym names.
* object.h (Sized_relobj_file::get_symbol_name): Update decl.
* target-reloc.h (issue_discarded_error): Adjust.
* powerpc.cc (Target_powerpc::Relocate::relocate): Report reloc
type and symbol for relocation overflows.
Diffstat (limited to 'gold/object.cc')
-rw-r--r-- | gold/object.cc | 45 |
1 files changed, 37 insertions, 8 deletions
diff --git a/gold/object.cc b/gold/object.cc index 77b2690..acd7c94 100644 --- a/gold/object.cc +++ b/gold/object.cc @@ -3054,7 +3054,7 @@ Sized_relobj_file<size, big_endian>::find_kept_section_object( // Return the name of symbol SYMNDX. template<int size, bool big_endian> -const char* +std::string Sized_relobj_file<size, big_endian>::get_symbol_name(unsigned int symndx) { if (this->symtab_shndx_ == 0) @@ -3065,6 +3065,24 @@ Sized_relobj_file<size, big_endian>::get_symbol_name(unsigned int symndx) &symbols_size, false); + const unsigned char* p = symbols + symndx * This::sym_size; + if (p >= symbols + symbols_size) + return NULL; + + elfcpp::Sym<size, big_endian> sym(p); + + if (sym.get_st_name() == 0 && sym.get_st_type() == elfcpp::STT_SECTION) + { + bool is_ordinary; + unsigned int sym_shndx = this->adjust_sym_shndx(symndx, + sym.get_st_shndx(), + &is_ordinary); + if (!is_ordinary || sym_shndx >= this->shnum()) + return NULL; + + return this->section_name(sym_shndx); + } + unsigned int symbol_names_shndx = this->adjust_shndx(this->section_link(this->symtab_shndx_)); section_size_type names_size; @@ -3072,14 +3090,25 @@ Sized_relobj_file<size, big_endian>::get_symbol_name(unsigned int symndx) this->section_contents(symbol_names_shndx, &names_size, false); const char* symbol_names = reinterpret_cast<const char*>(symbol_names_u); - const unsigned char* p = symbols + symndx * This::sym_size; - - if (p >= symbols + symbols_size) + unsigned int sym_name = sym.get_st_name(); + if (sym_name >= names_size) return NULL; - - elfcpp::Sym<size, big_endian> sym(p); - - return symbol_names + sym.get_st_name(); + const char* namep = symbol_names + sym_name; + const void* endp = memchr(namep, 0, names_size - sym_name); + if (!endp) + endp = symbol_names + names_size; + std::string name = std::string(namep, static_cast<const char*>(endp) - namep); + + if (!parameters->options().do_demangle()) + return name; + + char* demangled_name = cplus_demangle(name.c_str(), DMGL_ANSI | DMGL_PARAMS); + if (!demangled_name) + return name; + + name = demangled_name; + free(demangled_name); + return name; } // Get symbol counts. |