summaryrefslogtreecommitdiff
path: root/rtemstoolkit/rld-symbols.cpp
diff options
context:
space:
mode:
authorChris Johns <chrisj@rtems.org>2017-08-16 18:09:59 +1000
committerChris Johns <chrisj@rtems.org>2017-08-16 18:18:35 +1000
commit78bbe4c1a31dc62c3a9bee919645c0aa8781709b (patch)
tree51caba18f81dd97459d45c00ba5bdb3d468e112c /rtemstoolkit/rld-symbols.cpp
parent0ea1c27f792a486badddb24c6ab219e4af0d91c3 (diff)
linkers/exe-info Support ARM static constructors.
Note, ARM destructors are registered at runtime and currently not easly found. Update libiberty to get a newer demangler. Closes #3102.
Diffstat (limited to 'rtemstoolkit/rld-symbols.cpp')
-rw-r--r--rtemstoolkit/rld-symbols.cpp45
1 files changed, 24 insertions, 21 deletions
diff --git a/rtemstoolkit/rld-symbols.cpp b/rtemstoolkit/rld-symbols.cpp
index 19d5680..642d53f 100644
--- a/rtemstoolkit/rld-symbols.cpp
+++ b/rtemstoolkit/rld-symbols.cpp
@@ -38,29 +38,34 @@ namespace rld
* Get the demangled name.
*/
bool
- is_cplusplus (const std::string& name)
+ demangle_name (const std::string& name, std::string& demangled)
{
- char* demangled_name = ::cplus_demangle (name.c_str (),
- DMGL_ANSI | DMGL_PARAMS);
bool yes = false;
- if (demangled_name)
+ if (name.length() == 0)
+ demangled = name;
+ else
{
- yes = true;
- ::free (demangled_name);
+ std::string wrapper = "_GLOBAL__sub_I_";
+ size_t offset = 0;
+ if (name.compare (0, wrapper.length (), wrapper) == 0)
+ offset = wrapper.length ();
+ char* demangled_name = ::cplus_demangle (name.c_str () + offset,
+ DMGL_ANSI | DMGL_PARAMS);
+ if (demangled_name)
+ {
+ demangled = demangled_name;
+ ::free (demangled_name);
+ yes = true;
+ }
}
return yes;
}
- void
- demangle_name (std::string& name, std::string& demangled)
+ bool
+ is_cplusplus (const std::string& name)
{
- char* demangled_name = ::cplus_demangle (name.c_str (),
- DMGL_ANSI | DMGL_PARAMS);
- if (demangled_name)
- {
- demangled = demangled_name;
- ::free (demangled_name);
- }
+ std::string demangled;
+ return symbols::demangle_name (name, demangled);
}
symbol::symbol ()
@@ -83,8 +88,7 @@ namespace rld
{
if (!object_)
throw rld_error_at ("object pointer is 0");
- if (is_cplusplus ())
- demangle_name (name_, demangled_);
+ demangle_name (name_, demangled_);
}
symbol::symbol (int index,
@@ -96,8 +100,7 @@ namespace rld
esym_ (esym),
references_ (0)
{
- if (is_cplusplus ())
- demangle_name (name_, demangled_);
+ demangle_name (name_, demangled_);
}
symbol::symbol (const std::string& name,
@@ -143,7 +146,7 @@ namespace rld
bool
symbol::is_cplusplus () const
{
- return (name_[0] == '_') && (name_[1] == 'Z');
+ return symbols::is_cplusplus (name_);
}
bool
@@ -279,7 +282,7 @@ namespace rld
break;
}
- out << std::setw (5) << index_
+ out << std::setw (8) << index_
<< ' ' << binding
<< ' ' << type
<< ' ' << std::setw(6) << es.st_shndx