* score-dis.c (print_insn_score48, print_insn_score32): Move default
[deliverable/binutils-gdb.git] / gold / dynobj.cc
index 89186adecbc84cfcaf8c2119487a7a824e217a73..8761eaa5832c86567725226110e5b347359fa120 100644 (file)
@@ -73,7 +73,9 @@ Sized_dynobj<size, big_endian>::Sized_dynobj(
     const elfcpp::Ehdr<size, big_endian>& ehdr)
   : Dynobj(name, input_file, offset),
     elf_file_(this, ehdr),
-    dynsym_shndx_(-1U)
+    dynsym_shndx_(-1U),
+    symbols_(NULL),
+    defined_count_(0)
 {
 }
 
@@ -653,7 +655,8 @@ Sized_dynobj<size, big_endian>::make_version_map(
 template<int size, bool big_endian>
 void
 Sized_dynobj<size, big_endian>::do_add_symbols(Symbol_table* symtab,
-                                              Read_symbols_data* sd)
+                                              Read_symbols_data* sd,
+                                              Layout*)
 {
   if (sd->symbols == NULL)
     {
@@ -675,6 +678,14 @@ Sized_dynobj<size, big_endian>::do_add_symbols(Symbol_table* symtab,
   Version_map version_map;
   this->make_version_map(sd, &version_map);
 
+  // If printing symbol counts, we want to track symbols.
+  
+  if (parameters->options().user_set_print_symbol_counts())
+    {
+      this->symbols_ = new Symbols();
+      this->symbols_->resize(symcount);
+    }
+
   const char* sym_names =
     reinterpret_cast<const char*>(sd->symbol_names->data());
   symtab->add_from_dynobj(this, sd->symbols->data(), symcount,
@@ -683,7 +694,9 @@ Sized_dynobj<size, big_endian>::do_add_symbols(Symbol_table* symtab,
                           ? NULL
                           : sd->versym->data()),
                          sd->versym_size,
-                         &version_map);
+                         &version_map,
+                         this->symbols_,
+                         &this->defined_count_);
 
   delete sd->symbols;
   sd->symbols = NULL;
@@ -710,6 +723,29 @@ Sized_dynobj<size, big_endian>::do_add_symbols(Symbol_table* symtab,
   this->clear_view_cache_marks();
 }
 
+// Get symbol counts.
+
+template<int size, bool big_endian>
+void
+Sized_dynobj<size, big_endian>::do_get_global_symbol_counts(
+    const Symbol_table*,
+    size_t* defined,
+    size_t* used) const
+{
+  *defined = this->defined_count_;
+  size_t count = 0;
+  for (typename Symbols::const_iterator p = this->symbols_->begin();
+       p != this->symbols_->end();
+       ++p)
+    if (*p != NULL
+       && (*p)->source() == Symbol::FROM_OBJECT
+       && (*p)->object() == this
+       && (*p)->is_defined()
+       && (*p)->dynsym_index() != -1U)
+      ++count;
+  *used = count;
+}
+
 // Given a vector of hash codes, compute the number of hash buckets to
 // use.
 
@@ -1270,16 +1306,15 @@ Versions::Versions(const Version_script_info& version_script,
   : defs_(), needs_(), version_table_(),
     is_finalized_(false), version_script_(version_script)
 {
-  // We always need a base version, so define that first. Nothing
+  // We always need a base version, so define that first.  Nothing
   // explicitly declares itself as part of base, so it doesn't need to
   // be in version_table_.
-  // FIXME: Should use soname here when creating a shared object. Is
-  // this fixme still valid? It looks like it's doing the right thing
-  // to me.
   if (parameters->options().shared())
     {
-      const char* name = dynpool->add(parameters->options().output_file_name(),
-                                      false, NULL);
+      const char* name = parameters->options().soname();
+      if (name == NULL)
+       name = parameters->options().output_file_name();
+      name = dynpool->add(name, false, NULL);
       Verdef* vdbase = new Verdef(name, std::vector<std::string>(),
                                   true, false, true);
       this->defs_.push_back(vdbase);
@@ -1388,11 +1423,8 @@ Versions::add_def(const Symbol* sym, const char* version,
       // find a definition of a symbol with a version which is not
       // in the version script.
       if (parameters->options().shared())
-       {
-         gold_error(_("symbol %s has undefined version %s"),
-                    sym->demangled_name().c_str(), version);
-         return;
-       }
+       gold_error(_("symbol %s has undefined version %s"),
+                  sym->demangled_name().c_str(), version);
 
       // When creating a regular executable, automatically define
       // a new version.
This page took 0.0266 seconds and 4 git commands to generate.