#define GOLD_TARGET_H
#include "elfcpp.h"
+#include "options.h"
+#include "parameters.h"
namespace gold
{
class Object;
template<int size, bool big_endian>
class Sized_relobj;
+class Relocatable_relocs;
template<int size, bool big_endian>
class Relocate_info;
class Symbol;
// Return the ABI specified page size.
uint64_t
abi_pagesize() const
- { return this->pti_->abi_pagesize; }
+ {
+ if (parameters->options().max_page_size() > 0)
+ return parameters->options().max_page_size();
+ else
+ return this->pti_->abi_pagesize;
+ }
// Return the common page size used on actual systems.
uint64_t
common_pagesize() const
- { return this->pti_->common_pagesize; }
+ {
+ if (parameters->options().common_page_size() > 0)
+ return std::min(parameters->options().common_page_size(),
+ this->abi_pagesize());
+ else
+ return std::min(this->pti_->common_pagesize,
+ this->abi_pagesize());
+ }
// If we see some object files with .note.GNU-stack sections, and
// some objects files without them, this returns whether we should
// basically one or more NOPS which must fill out the specified
// length in bytes.
std::string
- code_fill(off_t length)
+ code_fill(section_size_type length) const
{ return this->do_code_fill(length); }
+ // Return whether SYM is known to be defined by the ABI. This is
+ // used to avoid inappropriate warnings about undefined symbols.
+ bool
+ is_defined_by_abi(Symbol* sym) const
+ { return this->do_is_defined_by_abi(sym); }
+
protected:
// This struct holds the constant information for a child class. We
// use a struct to avoid the overhead of virtual function calls for
// Virtual function which must be implemented by the child class if
// needed.
virtual std::string
- do_code_fill(off_t)
+ do_code_fill(section_size_type) const
{ gold_unreachable(); }
+ // Virtual function which may be implemented by the child class.
+ virtual bool
+ do_is_defined_by_abi(Symbol*) const
+ { return false; }
+
private:
Target(const Target&);
Target& operator=(const Target&);
bool needs_special_offset_handling,
unsigned char* view,
typename elfcpp::Elf_types<size>::Elf_Addr view_address,
- off_t view_size) = 0;
+ section_size_type view_size) = 0;
+
+ // Scan the relocs during a relocatable link. The parameters are
+ // like scan_relocs, with an additional Relocatable_relocs
+ // parameter, used to record the disposition of the relocs.
+ virtual void
+ scan_relocatable_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,
+ Output_section* output_section,
+ bool needs_special_offset_handling,
+ size_t local_symbol_count,
+ const unsigned char* plocal_symbols,
+ Relocatable_relocs*) = 0;
+
+ // Relocate a section during a relocatable link. The parameters are
+ // like relocate_section, with additional parameters for the view of
+ // the output reloc section.
+ virtual void
+ relocate_for_relocatable(const Relocate_info<size, big_endian>*,
+ unsigned int sh_type,
+ const unsigned char* prelocs,
+ size_t reloc_count,
+ Output_section* output_section,
+ off_t offset_in_output_section,
+ const Relocatable_relocs*,
+ unsigned char* view,
+ typename elfcpp::Elf_types<size>::Elf_Addr
+ view_address,
+ section_size_type view_size,
+ unsigned char* reloc_view,
+ section_size_type reloc_view_size) = 0;
protected:
Sized_target(const Target::Target_info* pti)