This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
gold patch committed: If no dynamic symbols, use normal symbols
- From: Ian Lance Taylor <iant at google dot com>
- To: binutils at sourceware dot org
- Date: Fri, 08 Jan 2010 13:26:15 -0800
- Subject: 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,