#ifndef GOLD_TARGET_H
#define GOLD_TARGET_H
-#include <cassert>
-
#include "elfcpp.h"
-#include "symtab.h"
namespace gold
{
+class General_options;
class Object;
template<int size, bool big_endian>
-class Sized_object;
+class Sized_relobj;
+template<int size, bool big_endian>
+struct Relocate_info;
+class Symbol;
+template<int size>
+class Sized_symbol;
+class Symbol_table;
// The abstract class for target specific handling.
has_resolve() const
{ return this->pti_->has_resolve; }
+ // Return the default name of the dynamic linker.
+ const char*
+ dynamic_linker() const
+ { return this->pti_->dynamic_linker; }
+
// Return the default address to use for the text segment.
uint64_t
text_segment_address() const
common_pagesize() const
{ return this->pti_->common_pagesize; }
+ // This is called to tell the target to complete any sections it is
+ // handling. After this all sections must have their final size.
+ void
+ finalize_sections(const General_options* options, Layout* layout)
+ { return this->do_finalize_sections(options, layout); }
+
protected:
// This struct holds the constant information for a child class. We
// use a struct to avoid the overhead of virtual function calls for
bool has_make_symbol;
// Whether this target has a specific resolve function.
bool has_resolve;
+ // The default dynamic linker name.
+ const char* dynamic_linker;
// The default text segment address.
uint64_t text_segment_address;
// The ABI specified page size.
: pti_(pti)
{ }
+ // Virtual function which may be implemented by the child class.
+ virtual void
+ do_finalize_sections(const General_options*, Layout*)
+ { }
+
private:
Target(const Target&);
Target& operator=(const Target&);
// symbol table. This will only be called if has_make_symbol()
// returns true.
virtual Sized_symbol<size>*
- make_symbol()
- { abort(); }
+ make_symbol() const
+ { gold_unreachable(); }
// Resolve a symbol for the target. This should be overridden by a
// target which needs to take special action. TO is the
// pre-existing symbol. SYM is the new symbol, seen in OBJECT.
+ // VERSION is the version of SYM. This will only be called if
+ // has_resolve() returns true.
+ virtual void
+ resolve(Symbol*, const elfcpp::Sym<size, big_endian>&, Object*,
+ const char*)
+ { gold_unreachable(); }
+
+ // Scan the relocs for a section, and record any information
+ // required for the symbol. OPTIONS is the command line options.
+ // SYMTAB is the symbol table. OBJECT is the object in which the
+ // section appears. DATA_SHNDX is the section index that these
+ // relocs apply to. SH_TYPE is the type of the relocation section,
+ // SHT_REL or SHT_RELA. PRELOCS points to the relocation data.
+ // RELOC_COUNT is the number of relocs. LOCAL_SYMBOL_COUNT is the
+ // number of local symbols. PLOCAL_SYMBOLS points to the local
+ // symbol data from OBJECT. GLOBAL_SYMBOLS is the array of pointers
+ // to the global symbol table from OBJECT.
virtual void
- resolve(Symbol*, const elfcpp::Sym<size, big_endian>&, Object*)
- { abort(); }
-
- // Relocate section data. SYMTAB is the symbol table. OBJECT is
- // the object in which the section appears. SH_TYPE is the type of
- // the relocation section, SHT_REL or SHT_RELA. PRELOCS points to
- // the relocation information. RELOC_COUNT is the number of relocs.
- // LOCAL_COUNT is the number of local symbols. The VALUES and
- // GLOBAL_SYMS have symbol table information. VIEW is a view into
- // the output file holding the section contents, VIEW_ADDRESS is the
- // virtual address of the view, and VIEW_SIZE is the size of the
- // view.
+ scan_relocs(const General_options& options,
+ Symbol_table* symtab,
+ Layout* layout,
+ Sized_relobj<size, big_endian>* object,
+ unsigned int data_shndx,
+ unsigned int sh_type,
+ const unsigned char* prelocs,
+ size_t reloc_count,
+ size_t local_symbol_count,
+ const unsigned char* plocal_symbols,
+ Symbol** global_symbols) = 0;
+
+ // Relocate section data. SH_TYPE is the type of the relocation
+ // section, SHT_REL or SHT_RELA. PRELOCS points to the relocation
+ // information. RELOC_COUNT is the number of relocs. VIEW is a
+ // view into the output file holding the section contents,
+ // VIEW_ADDRESS is the virtual address of the view, and VIEW_SIZE is
+ // the size of the view.
virtual void
- relocate_section(const Symbol_table*, // symtab
- Sized_object<size, big_endian>*, // object
- unsigned int, // sh_type
- const unsigned char*, // prelocs
- size_t, // reloc_count
- unsigned int, // local_count
- const typename elfcpp::Elf_types<size>::Elf_Addr*, // values
- Symbol**, // global_syms
- unsigned char*, // view
- typename elfcpp::Elf_types<size>::Elf_Addr, // view_address
- off_t) // view_size
- { abort(); }
+ relocate_section(const Relocate_info<size, big_endian>*,
+ unsigned int sh_type,
+ const unsigned char* prelocs,
+ size_t reloc_count,
+ unsigned char* view,
+ typename elfcpp::Elf_types<size>::Elf_Addr view_address,
+ off_t view_size) = 0;
protected:
Sized_target(const Target::Target_info* pti)
: Target(pti)
{
- assert(pti->size == size);
- assert(pti->is_big_endian ? big_endian : !big_endian);
+ gold_assert(pti->size == size);
+ gold_assert(pti->is_big_endian ? big_endian : !big_endian);
}
};