// 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)
&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;
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.
&& gsym->is_undefined()
&& is_branch_reloc<size>(r_type))))
{
+ std::string name;
+ if (gsym)
+ name = gsym->demangled_name();
+ else
+ name = relinfo->object->get_symbol_name(r_sym);
if (os->flags() & elfcpp::SHF_ALLOC)
{
gold_error_at_location(relinfo, relnum, rela.get_r_offset(),
- _("relocation overflow"));
+ _("reloc type %u overflow against '%s'"),
+ r_type, name.c_str());
if (has_stub_value)
gold_info(_("try relinking with a smaller --stub-group-size"));
}
else
{
gold_warning_at_location(relinfo, relnum, rela.get_r_offset(),
- _("relocation overflow"));
+ _("reloc type %u overflow against '%s'"),
+ r_type, name.c_str());
gold_info(_("debug info may be unreliable, compile with -gdwarf64"));
}
}
relinfo, shndx, offset,
_("relocation refers to local symbol \"%s\" [%u], "
"which is defined in a discarded section"),
- object->get_symbol_name(r_sym), r_sym);
+ object->get_symbol_name(r_sym).c_str(), r_sym);
}
else
{
&key_symndx);
if (key_symndx != 0)
gold_info(_(" section group signature: \"%s\""),
- object->get_symbol_name(key_symndx));
+ object->get_symbol_name(key_symndx).c_str());
if (kept_obj != NULL)
gold_info(_(" prevailing definition is from %s"),
kept_obj->name().c_str());