PR 6716
[binutils-gdb.git] / gold / dynobj.h
index d61df16b92fbcc7856e52f6d34e5ebcfeedc4055..b5b9bd9725dd6113e60d81cbeeb249e6149d30ba 100644 (file)
@@ -1,6 +1,6 @@
 // dynobj.h -- dynamic object support for gold   -*- C++ -*-
 
-// Copyright 2006, 2007 Free Software Foundation, Inc.
+// Copyright 2006, 2007, 2008 Free Software Foundation, Inc.
 // Written by Ian Lance Taylor <iant@google.com>.
 
 // This file is part of gold.
@@ -31,7 +31,6 @@
 namespace gold
 {
 
-class General_options;
 class Version_script_info;
 
 // A dynamic object (ET_DYN).  This is an abstract base class itself.
@@ -157,6 +156,8 @@ template<int size, bool big_endian>
 class Sized_dynobj : public Dynobj
 {
  public:
+  typedef typename Sized_relobj<size, big_endian>::Symbols Symbols;
+
   Sized_dynobj(const std::string& name, Input_file* input_file, off_t offset,
               const typename elfcpp::Ehdr<size, big_endian>&);
 
@@ -222,6 +223,14 @@ class Sized_dynobj : public Dynobj
   do_section_addralign(unsigned int shndx)
   { return this->elf_file_.section_addralign(shndx); }
 
+  // Return the Xindex structure to use.
+  Xindex*
+  do_initialize_xindex();
+
+  // Get symbol counts.
+  void
+  do_get_global_symbol_counts(const Symbol_table*, size_t*, size_t*) const;
+
  private:
   // For convenience.
   typedef Sized_dynobj<size, big_endian> This;
@@ -231,11 +240,19 @@ class Sized_dynobj : public Dynobj
   typedef elfcpp::Shdr<size, big_endian> Shdr;
   typedef elfcpp::Dyn<size, big_endian> Dyn;
 
+  // Adjust a section index if necessary.
+  unsigned int
+  adjust_shndx(unsigned int shndx)
+  {
+    if (shndx >= elfcpp::SHN_LORESERVE)
+      shndx += this->elf_file_.large_shndx_offset();
+    return shndx;
+  }
+
   // Find the dynamic symbol table and the version sections, given the
   // section headers.
   void
   find_dynsym_sections(const unsigned char* pshdrs,
-                      unsigned int* pdynshm_shndx,
                       unsigned int* pversym_shndx,
                       unsigned int* pverdef_shndx,
                       unsigned int* pverneed_shndx,
@@ -275,6 +292,13 @@ class Sized_dynobj : public Dynobj
 
   // General access to the ELF file.
   elfcpp::Elf_file<size, big_endian, Object> elf_file_;
+  // The section index of the dynamic symbol table.
+  unsigned int dynsym_shndx_;
+  // The entries in the symbol table for the symbols.  We only keep
+  // this if we need it to print symbol information.
+  Symbols* symbols_;
+  // Number of defined symbols.
+  size_t defined_count_;
 };
 
 // A base class for Verdef and Verneed_version which just handles the
@@ -366,8 +390,7 @@ class Verdef : public Version_base
   // Write contents to buffer.
   template<int size, bool big_endian>
   unsigned char*
-  write(const Stringpool*, bool is_last, unsigned char*
-        ACCEPT_SIZE_ENDIAN) const;
+  write(const Stringpool*, bool is_last, unsigned char*) const;
 
  private:
   Verdef(const Verdef&);
@@ -452,8 +475,7 @@ class Verneed
   // Write contents to buffer.
   template<int size, bool big_endian>
   unsigned char*
-  write(const Stringpool*, bool is_last, unsigned char*
-        ACCEPT_SIZE_ENDIAN) const;
+  write(const Stringpool*, bool is_last, unsigned char*) const;
 
  private:
   Verneed(const Verneed&);
@@ -476,7 +498,7 @@ class Verneed
 class Versions
 {
  public:
-  Versions(const General_options&, Stringpool*);
+  Versions(const Version_script_info&, Stringpool*);
 
   ~Versions();
 
@@ -509,29 +531,26 @@ class Versions
   symbol_section_contents(const Symbol_table*, const Stringpool*,
                          unsigned int local_symcount,
                          const std::vector<Symbol*>& syms,
-                         unsigned char**, unsigned int*
-                          ACCEPT_SIZE_ENDIAN) const;
+                         unsigned char**, unsigned int*) const;
 
   // Build an allocated buffer holding the contents of the version
   // definition section (.gnu.version_d).
   template<int size, bool big_endian>
   void
   def_section_contents(const Stringpool*, unsigned char**,
-                      unsigned int* psize, unsigned int* pentries
-                       ACCEPT_SIZE_ENDIAN) const;
+                      unsigned int* psize, unsigned int* pentries) const;
 
   // Build an allocated buffer holding the contents of the version
   // reference section (.gnu.version_r).
   template<int size, bool big_endian>
   void
   need_section_contents(const Stringpool*, unsigned char**,
-                       unsigned int* psize, unsigned int* pentries
-                        ACCEPT_SIZE_ENDIAN) const;
+                       unsigned int* psize, unsigned int* pentries) const;
 
   const Version_script_info&
   version_script() const
   { return this->version_script_; }
-      
+
  private:
   Versions(const Versions&);
   Versions& operator=(const Versions&);