This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

gold patch committed: If no dynamic symbols, use normal symbols


When the GNU linker sees a shared library with no dynamic symbols, it
uses the normal symbols instead.  This turns out to be required on
some systems, as explained in slightly more detail in a comment in the
patch.  I committed this patch to gold to make it work the same way.

Ian


2010-01-08  Ian Lance Taylor  <iant@google.com>

	PR 11084
	* dynobj.cc (Sized_dynobj::find_dynsym_sections): If there is no
	dynamic symbol table, use the normal symbol table.
	(Sized_dynobj::do_read_symbols): Remove assertion about type of
	symbol table.


Index: dynobj.cc
===================================================================
RCS file: /cvs/src/src/gold/dynobj.cc,v
retrieving revision 1.53
diff -p -u -r1.53 dynobj.cc
--- dynobj.cc	5 Jan 2010 21:52:51 -0000	1.53
+++ dynobj.cc	8 Jan 2010 21:23:22 -0000
@@ -106,6 +106,7 @@ Sized_dynobj<size, big_endian>::find_dyn
   *pverneed_shndx = -1U;
   *pdynamic_shndx = -1U;
 
+  unsigned int symtab_shndx = 0;
   unsigned int xindex_shndx = 0;
   unsigned int xindex_link = 0;
   const unsigned int shnum = this->shnum();
@@ -128,6 +129,9 @@ Sized_dynobj<size, big_endian>::find_dyn
 	    }
 	  pi = NULL;
 	  break;
+	case elfcpp::SHT_SYMTAB:
+	  symtab_shndx = i;
+	  break;
 	case elfcpp::SHT_GNU_versym:
 	  pi = pversym_shndx;
 	  break;
@@ -166,6 +170,25 @@ Sized_dynobj<size, big_endian>::find_dyn
 
       *pi = i;
     }
+
+  // If there is no dynamic symbol table, use the normal symbol table.
+  // On some SVR4 systems, a shared library is stored in an archive.
+  // The version stored in the archive only has a normal symbol table.
+  // It has an SONAME entry which points to another copy in the file
+  // system which has a dynamic symbol table as usual.  This is way of
+  // addressing the issues which glibc addresses using GROUP with
+  // libc_nonshared.a.
+  if (this->dynsym_shndx_ == -1U && symtab_shndx != 0)
+    {
+      this->dynsym_shndx_ = symtab_shndx;
+      if (xindex_shndx > 0 && xindex_link == symtab_shndx)
+	{
+	  Xindex* xindex = new Xindex(this->elf_file_.large_shndx_offset());
+	  xindex->read_symtab_xindex<size, big_endian>(this, xindex_shndx,
+						       pshdrs);
+	  this->set_xindex(xindex);
+	}
+    }
 }
 
 // Read the contents of section SHNDX.  PSHDRS points to the section
@@ -337,7 +360,6 @@ Sized_dynobj<size, big_endian>::do_read_
       // Get the dynamic symbols.
       typename This::Shdr dynsymshdr(pshdrs
 				     + this->dynsym_shndx_ * This::shdr_size);
-      gold_assert(dynsymshdr.get_sh_type() == elfcpp::SHT_DYNSYM);
 
       sd->symbols = this->get_lasting_view(dynsymshdr.get_sh_offset(),
 					   dynsymshdr.get_sh_size(), true,

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]