diff options
-rw-r--r-- | gold/ChangeLog | 8 | ||||
-rw-r--r-- | gold/dynobj.cc | 24 |
2 files changed, 31 insertions, 1 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index 214999b..cf0707d 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,5 +1,13 @@ 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. + +2010-01-08 Ian Lance Taylor <iant@google.com> + PR 11072 * layout.cc (Layout::include_section): Remove .gnu_debuglink sections. diff --git a/gold/dynobj.cc b/gold/dynobj.cc index fac8715..cb41402 100644 --- a/gold/dynobj.cc +++ b/gold/dynobj.cc @@ -106,6 +106,7 @@ Sized_dynobj<size, big_endian>::find_dynsym_sections( *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_dynsym_sections( } 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_dynsym_sections( *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_symbols(Read_symbols_data* sd) // 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, |