summaryrefslogtreecommitdiff
path: root/rld-files.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'rld-files.cpp')
-rw-r--r--rld-files.cpp70
1 files changed, 63 insertions, 7 deletions
diff --git a/rld-files.cpp b/rld-files.cpp
index 75860ba..9887e48 100644
--- a/rld-files.cpp
+++ b/rld-files.cpp
@@ -979,7 +979,9 @@ namespace rld
object::object (archive& archive_, file& name_)
: image (name_),
archive_ (&archive_),
- valid_ (false)
+ valid_ (false),
+ resolving_ (false),
+ resolved_ (false)
{
if (!name ().is_valid ())
throw rld_error_at ("name is empty");
@@ -988,7 +990,9 @@ namespace rld
object::object (const std::string& path)
: image (path),
archive_ (0),
- valid_ (false)
+ valid_ (false),
+ resolving_ (false),
+ resolved_ (false)
{
if (!name ().is_valid ())
throw rld_error_at ("name is empty");
@@ -996,7 +1000,9 @@ namespace rld
object::object ()
: archive_ (0),
- valid_ (false)
+ valid_ (false),
+ resolving_ (false),
+ resolved_ (false)
{
}
@@ -1116,7 +1122,7 @@ namespace rld
rld::symbols::pointers syms;
- elf ().get_symbols (syms, false, local);
+ elf ().get_symbols (syms, false, local, false, true);
if (rld::verbose () >= RLD_VERBOSE_TRACE_SYMS)
std::cout << "object:load-sym: exported: total "
@@ -1132,11 +1138,31 @@ namespace rld
std::cout << "object:load-sym: exported: " << sym << std::endl;
sym.set_object (*this);
- symbols[sym.name ()] = &sym;
+ symbols.add_external (sym);
externals.push_back (&sym);
}
- elf ().get_symbols (syms, true);
+ elf ().get_symbols (syms, false, false, true, false);
+
+ if (rld::verbose () >= RLD_VERBOSE_TRACE_SYMS)
+ std::cout << "object:load-sym: weak: total "
+ << syms.size () << std::endl;
+
+ for (symbols::pointers::iterator si = syms.begin ();
+ si != syms.end ();
+ ++si)
+ {
+ symbols::symbol& sym = *(*si);
+
+ if (rld::verbose () >= RLD_VERBOSE_TRACE_SYMS)
+ std::cout << "object:load-sym: weak: " << sym << std::endl;
+
+ sym.set_object (*this);
+ symbols.add_weak (sym);
+ externals.push_back (&sym);
+ }
+
+ elf ().get_symbols (syms, true, false, true, true);
if (rld::verbose () >= RLD_VERBOSE_TRACE_SYMS)
std::cout << "object:load-sym: unresolved: total "
@@ -1215,7 +1241,7 @@ namespace rld
return archive_;
}
- rld::symbols::table&
+ rld::symbols::symtab&
object::unresolved_symbols ()
{
return unresolved;
@@ -1281,6 +1307,36 @@ namespace rld
"' not found: " + name ().full (), "object::get-section");
}
+ void
+ object::resolve_set ()
+ {
+ resolving_ = true;
+ }
+
+ void
+ object::resolve_clear ()
+ {
+ resolving_ = false;
+ }
+
+ bool
+ object::resolving () const
+ {
+ return resolving_;
+ }
+
+ void
+ object::resolved_set ()
+ {
+ resolved_ = true;
+ }
+
+ bool
+ object::resolved () const
+ {
+ return resolved_;
+ }
+
cache::cache ()
: opened (false)
{