diff options
author | Chris Johns <chrisj@rtems.org> | 2012-11-19 10:36:34 +1100 |
---|---|---|
committer | Chris Johns <chrisj@rtems.org> | 2012-11-19 10:36:34 +1100 |
commit | 1976825c7894963e5201c8c95ba56a6684f1c7ff (patch) | |
tree | 3bf1958cd638463d1a4a478517156e5295cdd2ca /linkers | |
parent | ead8da1e335868bbcf000ceba3459cce08c949ee (diff) |
Resolve the ld and user undefines.
Diffstat (limited to 'linkers')
-rw-r--r-- | linkers/rld-resolver.cpp | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/linkers/rld-resolver.cpp b/linkers/rld-resolver.cpp index 60b69ef..abb7890 100644 --- a/linkers/rld-resolver.cpp +++ b/linkers/rld-resolver.cpp @@ -39,11 +39,12 @@ namespace rld namespace resolver { static void - resolve (rld::files::object_list& dependents, - rld::files::cache& cache, - rld::symbols::table& base_symbols, - rld::symbols::table& symbols, - rld::files::object& object) + resolve_symbols (rld::files::object_list& dependents, + rld::files::cache& cache, + rld::symbols::table& base_symbols, + rld::symbols::table& symbols, + rld::symbols::table& unresolved, + const std::string& name) { static int nesting = 0; @@ -58,15 +59,12 @@ namespace rld * 'es' is the exported symbol. */ - rld::symbols::table& unresolved = object.unresolved_symbols (); - if (rld::verbose () >= RLD_VERBOSE_INFO) std::cout << "resolver:resolving: " << std::setw (nesting - 1) << ' ' - << object.name ().basename () + << name << ", unresolved: " << unresolved.size () - << (((*unresolved.begin ()).second)->object () ? " (resolved)" : "") << std::endl; rld::files::object_list objects; @@ -90,7 +88,7 @@ namespace rld { esi = symbols.find (urs.name ()); if (esi == symbols.end ()) - throw rld::error ("symbol referenced in '" + object.name ().basename () + + throw rld::error ("symbol referenced in '" + name + "' not found: " + urs.name (), "resolving"); base = false; } @@ -128,7 +126,15 @@ namespace rld for (rld::files::object_list::iterator oli = objects.begin (); oli != objects.end (); ++oli) - resolve (dependents, cache, base_symbols, symbols, *(*oli)); + { + rld::files::object& object = *(*oli); + if (rld::verbose () >= RLD_VERBOSE_INFO) + std::cout << "resolver:resolving: : " + << object.name ().basename () << std::endl; + resolve_symbols (dependents, cache, base_symbols, symbols, + object.unresolved_symbols (), + object.name ().basename ()); + } --nesting; @@ -146,6 +152,16 @@ namespace rld rld::files::object_list objects; cache.get_objects (objects); + /* + * First resolve any undefined symbols that are forced by the linker or + * the user. + */ + resolver::resolve_symbols (dependents, cache, base_symbols, symbols, + undefined, "undefines"); + + /* + * Resolve the symbols in the object files. + */ for (rld::files::object_list::iterator oi = objects.begin (); oi != objects.end (); ++oi) @@ -154,7 +170,9 @@ namespace rld if (rld::verbose () >= RLD_VERBOSE_INFO) std::cout << "resolver:resolving: top: " << object.name ().basename () << std::endl; - resolve (dependents, cache, base_symbols, symbols, object); + resolver::resolve_symbols (dependents, cache, base_symbols, symbols, + object.unresolved_symbols (), + object.name ().basename ()); } } } |