class Output_section;
class Input_objects;
class Task;
+struct Symbol_location;
// The abstract class for target specific handling.
adjust_elf_header(unsigned char* view, int len) const
{ 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
reloc_addend(void* arg, unsigned int type, uint64_t addend) const
{ return this->do_reloc_addend(arg, type, addend); }
- // Return the PLT address to use for a global symbol. This is used
- // for STT_GNU_IFUNC symbols. The symbol's plt_offset is relative
- // to this PLT address.
+ // Return the PLT address to use for a global symbol.
uint64_t
plt_address_for_global(const Symbol* sym) const
{ return this->do_plt_address_for_global(sym); }
- // Return the PLT address to use for a local symbol. This is used
- // for STT_GNU_IFUNC symbols. The symbol's plt_offset is relative
- // to this PLT address.
+ // Return the PLT address to use for a local symbol.
uint64_t
plt_address_for_local(const Relobj* object, unsigned int symndx) const
{ return this->do_plt_address_for_local(object, symndx); }
+ // Return the offset to use for the GOT_INDX'th got entry which is
+ // for a local tls symbol specified by OBJECT, SYMNDX.
+ int64_t
+ tls_offset_for_local(const Relobj* object,
+ unsigned int symndx,
+ unsigned int got_indx) const
+ { return do_tls_offset_for_local(object, symndx, got_indx); }
+
+ // Return the offset to use for the GOT_INDX'th got entry which is
+ // for global tls symbol GSYM.
+ int64_t
+ 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; }
+
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;
};
Target(const Target_info* pti)
virtual void
do_adjust_elf_header(unsigned char*, int) const = 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_is_local_label_name(const char*) const;
do_plt_address_for_local(const Relobj*, unsigned int) const
{ gold_unreachable(); }
+ virtual int64_t
+ do_tls_offset_for_local(const Relobj*, unsigned int, unsigned int) const
+ { gold_unreachable(); }
+
+ virtual int64_t
+ 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
const unsigned char* prelocs,
size_t reloc_count,
Output_section* output_section,
- off_t offset_in_output_section,
+ typename elfcpp::Elf_types<size>::Elf_Off
+ offset_in_output_section,
const Relocatable_relocs*,
unsigned char* view,
typename elfcpp::Elf_types<size>::Elf_Addr view_address,
const unsigned char* /* preloc_in */,
size_t /* relnum */,
Output_section* /* output_section */,
- off_t /* offset_in_output_section */,
+ typename elfcpp::Elf_types<size>::Elf_Off
+ /* offset_in_output_section */,
unsigned char* /* view */,
typename elfcpp::Elf_types<size>::Elf_Addr
/* view_address */,
Object*, unsigned int,
typename elfcpp::Elf_types<size>::Elf_Addr) const
{ }
+
+ virtual void
+ do_function_location(Symbol_location*) const
+ { }
};
} // End namespace gold.