PR 6716
[binutils-gdb.git] / gold / dynobj.h
index 1fe37a4b600d4e5cac470034ee39bcc1770eaec2..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,7 @@
 namespace gold
 {
 
-class General_options;
+class Version_script_info;
 
 // A dynamic object (ET_DYN).  This is an abstract base class itself.
 // The implementations is the template class Sized_dynobj.
@@ -156,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>&);
 
@@ -175,6 +177,11 @@ class Sized_dynobj : public Dynobj
   void
   do_add_symbols(Symbol_table*, Read_symbols_data*);
 
+  // Get the size of a section.
+  uint64_t
+  do_section_size(unsigned int shndx)
+  { return this->elf_file_.section_size(shndx); }
+
   // Get the name of a section.
   std::string
   do_section_name(unsigned int shndx)
@@ -191,6 +198,11 @@ class Sized_dynobj : public Dynobj
   do_section_flags(unsigned int shndx)
   { return this->elf_file_.section_flags(shndx); }
 
+  // Return section address.
+  uint64_t
+  do_section_address(unsigned int shndx)
+  { return this->elf_file_.section_addr(shndx); }
+
   // Return section type.
   unsigned int
   do_section_type(unsigned int shndx)
@@ -206,6 +218,19 @@ class Sized_dynobj : public Dynobj
   do_section_info(unsigned int shndx)
   { return this->elf_file_.section_info(shndx); }
 
+  // Return the section alignment.
+  uint64_t
+  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;
@@ -215,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,
@@ -229,7 +262,7 @@ class Sized_dynobj : public Dynobj
   void
   read_dynsym_section(const unsigned char* pshdrs, unsigned int shndx,
                      elfcpp::SHT type, unsigned int link,
-                     File_view** view, off_t* view_size,
+                     File_view** view, section_size_type* view_size,
                      unsigned int* view_info);
 
   // Read the dynamic tags.
@@ -259,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
@@ -309,8 +349,9 @@ class Version_base
 class Verdef : public Version_base
 {
  public:
-  Verdef(const char* name, bool is_base, bool is_weak, bool is_symbol_created)
-    : name_(name), deps_(), is_base_(is_base), is_weak_(is_weak),
+  Verdef(const char* name, const std::vector<std::string>& deps,
+         bool is_base, bool is_weak, bool is_symbol_created)
+    : name_(name), deps_(deps), is_base_(is_base), is_weak_(is_weak),
       is_symbol_created_(is_symbol_created)
   { }
 
@@ -349,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&);
@@ -358,7 +398,7 @@ class Verdef : public Version_base
 
   // The type of the list of version dependencies.  Each dependency
   // should be canonicalized in the dynamic Stringpool.
-  typedef std::vector<const char*> Deps;
+  typedef std::vector<std::string> Deps;
 
   // The name of this version.  This should be canonicalized in the
   // dynamic Stringpool.
@@ -435,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&);
@@ -459,9 +498,7 @@ class Verneed
 class Versions
 {
  public:
-  Versions()
-    : defs_(), needs_(), version_table_(), is_finalized_(false)
-  { }
+  Versions(const Version_script_info&, Stringpool*);
 
   ~Versions();
 
@@ -474,7 +511,7 @@ class Versions
   // for the next dynamic symbol.  We add new dynamic symbols to SYMS
   // and return an updated DYNSYM_INDEX.
   unsigned int
-  finalize(const Target*, Symbol_table* symtab, unsigned int dynsym_index,
+  finalize(Symbol_table* symtab, unsigned int dynsym_index,
           std::vector<Symbol*>* syms);
 
   // Return whether there are any version definitions.
@@ -494,26 +531,30 @@ 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&);
+
   // The type of the list of version definitions.
   typedef std::vector<Verdef*> Defs;
 
@@ -568,6 +609,8 @@ class Versions
   Version_table version_table_;
   // Whether the version indexes have been set.
   bool is_finalized_;
+  // Contents of --version-script, if passed, or NULL.
+  const Version_script_info& version_script_;
 };
 
 } // End namespace gold.