// target.h -- target support for gold -*- C++ -*-
-// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012
-// Free Software Foundation, Inc.
+// Copyright (C) 2006-2015 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.
// This file is part of gold.
#include "elfcpp.h"
#include "options.h"
#include "parameters.h"
+#include "stringpool.h"
#include "debug.h"
namespace gold
class Output_section;
class Input_objects;
class Task;
+struct Symbol_location;
+class Versions;
// The abstract class for target specific handling.
// Adjust the output file header before it is written out. VIEW
// points to the header in external form. LEN is the length.
void
- adjust_elf_header(unsigned char* view, int len) const
+ adjust_elf_header(unsigned char* view, int len)
{ return this->do_adjust_elf_header(view, len); }
+ // Return address and size to plug into eh_frame FDEs associated with a PLT.
+ void
+ plt_fde_location(const Output_data* plt, unsigned char* oview,
+ uint64_t* address, off_t* len) const
+ { return this->do_plt_fde_location(plt, oview, address, len); }
+
// Return whether NAME is a local label name. This is used to implement the
// --discard-locals options.
bool
tls_offset_for_global(Symbol* gsym, unsigned int got_indx) const
{ return do_tls_offset_for_global(gsym, got_indx); }
+ // For targets that use function descriptors, if LOC is the location
+ // of a function, modify it to point at the function entry location.
+ void
+ function_location(Symbol_location* loc) const
+ { return do_function_location(loc); }
+
// Return whether this target can use relocation types to determine
// if a function's address is taken.
bool
gc_mark_symbol(Symbol_table* symtab, Symbol* sym) const
{ this->do_gc_mark_symbol(symtab, sym); }
+ // Return the name of the entry point symbol.
+ const char*
+ entry_symbol_name() const
+ { return this->pti_->entry_symbol_name; }
+
+ // Return the size in bits of SHT_HASH entry.
+ int
+ hash_entry_size() const
+ { return this->pti_->hash_entry_size; }
+
+ // Whether the target has a custom set_dynsym_indexes method.
+ bool
+ has_custom_set_dynsym_indexes() const
+ { return this->do_has_custom_set_dynsym_indexes(); }
+
+ // Custom set_dynsym_indexes method for a target.
+ unsigned int
+ set_dynsym_indexes(std::vector<Symbol*>* dyn_symbols, unsigned int index,
+ std::vector<Symbol*>* syms, Stringpool* dynpool,
+ Versions* versions, Symbol_table* symtab) const
+ {
+ return this->do_set_dynsym_indexes(dyn_symbols, index, syms, dynpool,
+ versions, symtab);
+ }
+
+ // Get the custom dynamic tag value.
+ unsigned int
+ dynamic_tag_custom_value(elfcpp::DT tag) const
+ { return this->do_dynamic_tag_custom_value(tag); }
+
+ // Adjust the value written to the dynamic symbol table.
+ void
+ adjust_dyn_symbol(const Symbol* sym, unsigned char* view) const
+ { this->do_adjust_dyn_symbol(sym, view); }
+
+ // Return whether to include the section in the link.
+ bool
+ should_include_section(elfcpp::Elf_Word sh_type) const
+ { return this->do_should_include_section(sh_type); }
+
protected:
// This struct holds the constant information for a child class. We
// use a struct to avoid the overhead of virtual function calls for
const char* attributes_section;
// Vendor name of vendor attributes.
const char* attributes_vendor;
+ // Name of the main entry point to the program.
+ const char* entry_symbol_name;
+ // Size (in bits) of SHT_HASH entry. Always equal to 32, except for
+ // 64-bit S/390.
+ const int hash_entry_size;
};
Target(const Target_info* pti)
// By default, we set the EI_OSABI field if requested (in
// Sized_target).
virtual void
- do_adjust_elf_header(unsigned char*, int) const = 0;
+ do_adjust_elf_header(unsigned char*, int) = 0;
+
+ // Return address and size to plug into eh_frame FDEs associated with a PLT.
+ virtual void
+ do_plt_fde_location(const Output_data* plt, unsigned char* oview,
+ uint64_t* address, off_t* len) const;
// Virtual function which may be overridden by the child class.
virtual bool
do_tls_offset_for_global(Symbol*, unsigned int) const
{ gold_unreachable(); }
+ virtual void
+ do_function_location(Symbol_location*) const = 0;
+
// Virtual function which may be overriden by the child class.
virtual bool
do_can_check_for_function_pointers() const
do_gc_mark_symbol(Symbol_table*, Symbol*) const
{ }
+ // This may be overridden by the child class.
+ virtual bool
+ do_has_custom_set_dynsym_indexes() const
+ { return false; }
+
+ // This may be overridden by the child class.
+ virtual unsigned int
+ do_set_dynsym_indexes(std::vector<Symbol*>*, unsigned int,
+ std::vector<Symbol*>*, Stringpool*, Versions*,
+ Symbol_table*) const
+ { gold_unreachable(); }
+
+ // This may be overridden by the child class.
+ virtual unsigned int
+ do_dynamic_tag_custom_value(elfcpp::DT) const
+ { gold_unreachable(); }
+
+ // This may be overridden by the child class.
+ virtual void
+ do_adjust_dyn_symbol(const Symbol*, unsigned char*) const
+ { }
+
+ // This may be overridden by the child class.
+ virtual bool
+ do_should_include_section(elfcpp::Elf_Word) const
+ { return true; }
+
private:
// The implementations of the four do_make_elf_object virtual functions are
// almost identical except for their sizes and endianness. We use a template.
// and DST_OFF.
void
gc_add_reference(Symbol_table* symtab,
- Object* src_obj,
+ Relobj* src_obj,
unsigned int src_shndx,
- Object* dst_obj,
+ Relobj* dst_obj,
unsigned int dst_shndx,
typename elfcpp::Elf_types<size>::Elf_Addr dst_off) const
{
// Set the EI_OSABI field if requested.
virtual void
- do_adjust_elf_header(unsigned char*, int) const;
+ do_adjust_elf_header(unsigned char*, int);
// Handle target specific gc actions when adding a gc reference.
virtual void
- do_gc_add_reference(Symbol_table*, Object*, unsigned int,
- Object*, unsigned int,
+ do_gc_add_reference(Symbol_table*, Relobj*, unsigned int,
+ Relobj*, unsigned int,
typename elfcpp::Elf_types<size>::Elf_Addr) const
{ }
+
+ virtual void
+ do_function_location(Symbol_location*) const
+ { }
};
} // End namespace gold.