OSDN Git Service

Don't try to find version definition index when creating an executable.
authorIan Lance Taylor <iant@google.com>
Wed, 12 Sep 2007 00:30:59 +0000 (00:30 +0000)
committerIan Lance Taylor <iant@google.com>
Wed, 12 Sep 2007 00:30:59 +0000 (00:30 +0000)
gold/dynobj.cc
gold/dynobj.h
gold/layout.cc

index 96488d8..10f8fbe 100644 (file)
@@ -1366,7 +1366,8 @@ Versions::finalize(const Target* target, Symbol_table* symtab,
 // pointers.
 
 unsigned int
-Versions::version_index(const Stringpool* dynpool, const Symbol* sym) const
+Versions::version_index(const General_options* options,
+                        const Stringpool* dynpool, const Symbol* sym) const
 {
   Stringpool::Key version_key;
   const char* version = dynpool->find(sym->version(), &version_key);
@@ -1374,7 +1375,11 @@ Versions::version_index(const Stringpool* dynpool, const Symbol* sym) const
 
   Key k;
   if (!sym->is_from_dynobj())
-    k = Key(version_key, 0);
+    {
+      if (!options->is_shared())
+        return elfcpp::VER_NDX_GLOBAL;
+      k = Key(version_key, 0);
+    }
   else
     {
       Object* object = sym->object();
@@ -1399,7 +1404,8 @@ Versions::version_index(const Stringpool* dynpool, const Symbol* sym) const
 
 template<int size, bool big_endian>
 void
-Versions::symbol_section_contents(const Stringpool* dynpool,
+Versions::symbol_section_contents(const General_options* options,
+                                  const Stringpool* dynpool,
                                  unsigned int local_symcount,
                                  const std::vector<Symbol*>& syms,
                                  unsigned char** pp,
@@ -1424,7 +1430,7 @@ Versions::symbol_section_contents(const Stringpool* dynpool,
       if (version == NULL)
        version_index = elfcpp::VER_NDX_GLOBAL;
       else
-       version_index = this->version_index(dynpool, *p);
+       version_index = this->version_index(options, dynpool, *p);
       elfcpp::Swap<16, big_endian>::writeval(pbuf + (*p)->dynsym_index() * 2,
                                             version_index);
     }
@@ -1548,6 +1554,7 @@ class Sized_dynobj<64, true>;
 template
 void
 Versions::symbol_section_contents<32, false>(
+    const General_options*,
     const Stringpool*,
     unsigned int,
     const std::vector<Symbol*>&,
@@ -1560,6 +1567,7 @@ Versions::symbol_section_contents<32, false>(
 template
 void
 Versions::symbol_section_contents<32, true>(
+    const General_options*,
     const Stringpool*,
     unsigned int,
     const std::vector<Symbol*>&,
@@ -1572,6 +1580,7 @@ Versions::symbol_section_contents<32, true>(
 template
 void
 Versions::symbol_section_contents<64, false>(
+    const General_options*,
     const Stringpool*,
     unsigned int,
     const std::vector<Symbol*>&,
@@ -1584,6 +1593,7 @@ Versions::symbol_section_contents<64, false>(
 template
 void
 Versions::symbol_section_contents<64, true>(
+    const General_options*,
     const Stringpool*,
     unsigned int,
     const std::vector<Symbol*>&,
index d63aa6a..7575acd 100644 (file)
@@ -415,7 +415,8 @@ class Versions
   // version section (.gnu.version).
   template<int size, bool big_endian>
   void
-  symbol_section_contents(const Stringpool*, unsigned int local_symcount,
+  symbol_section_contents(const General_options*, const Stringpool*,
+                          unsigned int local_symcount,
                          const std::vector<Symbol*>& syms,
                          unsigned char**, unsigned int*
                           ACCEPT_SIZE_ENDIAN) const;
@@ -455,7 +456,8 @@ class Versions
 
   // Return the version index to use for SYM.
   unsigned int
-  version_index(const Stringpool*, const Symbol* sym) const;
+  version_index(const General_options*, const Stringpool*,
+                const Symbol* sym) const;
 
   // We keep a hash table mapping canonicalized name/version pairs to
   // a version base.
index d533722..3e8a223 100644 (file)
@@ -1056,8 +1056,8 @@ Layout::sized_create_version_sections(
   unsigned char* vbuf;
   unsigned int vsize;
   versions->symbol_section_contents SELECT_SIZE_ENDIAN_NAME(size, big_endian)(
-      &this->dynpool_, local_symcount, dynamic_symbols, &vbuf, &vsize
-      SELECT_SIZE_ENDIAN(size, big_endian));
+      &this->options_, &this->dynpool_, local_symcount, dynamic_symbols,
+      &vbuf, &vsize SELECT_SIZE_ENDIAN(size, big_endian));
 
   Output_section_data* vdata = new Output_data_const_buffer(vbuf, vsize, 2);