aboutsummaryrefslogtreecommitdiff
path: root/gold/object.cc
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2023-07-21 16:57:18 +0930
committerAlan Modra <amodra@gmail.com>2023-07-26 10:23:27 +0930
commiteb14a8b4bfb767beebfb54d7911da4132b5c0f94 (patch)
tree09953b7f145bdd9c8c58dbfd1b2824a87efc4ea5 /gold/object.cc
parent0d8e39f5ce5530cf548ca8a70ff19a34991e43cb (diff)
downloadgdb-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.cc45
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.