From 2e973519a4e71a6a41b3a11e4ea1d3b94476ebb3 Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Sun, 3 Apr 2016 15:38:14 +1000 Subject: rtemstoolkit: Add an address table of symbols key by the symbol address. This is useful if you need to look up a symbol based on its address. --- rtemstoolkit/rld-symbols.cpp | 36 ++++++++++++++++++++++++++++++++++++ rtemstoolkit/rld-symbols.h | 26 ++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/rtemstoolkit/rld-symbols.cpp b/rtemstoolkit/rld-symbols.cpp index 081d3e1..92803d8 100644 --- a/rtemstoolkit/rld-symbols.cpp +++ b/rtemstoolkit/rld-symbols.cpp @@ -361,6 +361,42 @@ namespace rld return locals_; } + void + table::globals (addrtab& addresses) + { + for (symtab::iterator gi = globals_.begin (); + gi != globals_.end (); + ++gi) + { + symbol& sym = *((*gi).second); + addresses[sym.value ()] = (*gi).second; + } + } + + void + table::weaks (addrtab& addresses) + { + for (symtab::iterator wi = weaks_.begin (); + wi != weaks_.end (); + ++wi) + { + symbol& sym = *((*wi).second); + addresses[sym.value ()] = (*wi).second; + } + } + + void + table::locals (addrtab& addresses) + { + for (symtab::iterator li = locals_.begin (); + li != locals_.end (); + ++li) + { + symbol& sym = *((*li).second); + addresses[sym.value ()] = (*li).second; + } + } + void load (bucket& bucket_, table& table_) { diff --git a/rtemstoolkit/rld-symbols.h b/rtemstoolkit/rld-symbols.h index 02a41a3..c8a61f4 100644 --- a/rtemstoolkit/rld-symbols.h +++ b/rtemstoolkit/rld-symbols.h @@ -44,6 +44,11 @@ namespace rld namespace symbols { + /** + * Use a local type for the address. + */ + typedef elf::elf_addr address; + /** * A symbol. */ @@ -204,6 +209,12 @@ namespace rld */ typedef std::map < std::string, symbol* > symtab; + /** + * An address table is a map container of symbols based on address. Should + * always point to symbols held in a bucket. + */ + typedef std::map < address, symbol* > addrtab; + /** * A symbols contains a symbol table of global, weak and local symbols. */ @@ -270,6 +281,21 @@ namespace rld */ const symtab& locals () const; + /** + * Return the globals symbol table keyed by address. + */ + void globals (addrtab& addresses); + + /** + * Return the weak symbol table keyed by address. + */ + void weaks (addrtab& addresses); + + /** + * Return the local symbol table keyed by address. + */ + void locals (addrtab& addresses); + private: /** -- cgit v1.2.3