summaryrefslogtreecommitdiff
path: root/rld-resolver.cpp
diff options
context:
space:
mode:
authorChris Johns <chrisj@rtems.org>2012-11-19 10:36:34 +1100
committerChris Johns <chrisj@rtems.org>2012-11-19 10:36:34 +1100
commit238be1bd1a750af044a52bd4b5ae6a763e0f307d (patch)
treecd5430f65f8622dbe71ea9bafb7c01aedd6e0b52 /rld-resolver.cpp
parent0ff50ba425d27e8168641b41c0eda4875ae30e04 (diff)
Resolve the ld and user undefines.
Diffstat (limited to 'rld-resolver.cpp')
-rw-r--r--rld-resolver.cpp42
1 files changed, 30 insertions, 12 deletions
diff --git a/rld-resolver.cpp b/rld-resolver.cpp
index 60b69ef..abb7890 100644
--- a/rld-resolver.cpp
+++ b/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 ());
}
}
}