set_is_copied_from_dynobj()
{ this->is_copied_from_dynobj_ = true; }
- // Mark this symbol as needing its value written to the GOT even when
- // the value is subject to dynamic relocation (e.g., when the target
- // uses a RELATIVE relocation for the GOT entry).
- void
- set_needs_value_in_got()
- { this->needs_value_in_got_ = true; }
-
- // Return whether this symbol needs its value written to the GOT even
- // when the value is subject to dynamic relocation.
- bool
- needs_value_in_got() const
- { return this->needs_value_in_got_; }
-
protected:
// Instances of this class should always be created at a specific
// size.
void
override_base_with_special(const Symbol* from);
+ // Allocate a common symbol by giving it a location in the output
+ // file.
+ void
+ allocate_base_common(Output_data*);
+
private:
Symbol(const Symbol&);
Symbol& operator=(const Symbol&);
// True if we are using a COPY reloc for this symbol, so that the
// real definition lives in a dynamic object.
bool is_copied_from_dynobj_ : 1;
- // True if the static value should be written to the GOT even
- // when the final value is subject to dynamic relocation.
- bool needs_value_in_got_ : 1;
};
// The parts of a symbol which are size specific. Using a template
set_value(Value_type value)
{ this->value_ = value; }
+ // Allocate a common symbol by giving it a location in the output
+ // file.
+ void
+ allocate_common(Output_data*, Value_type value);
+
private:
Sized_symbol(const Sized_symbol&);
Sized_symbol& operator=(const Sized_symbol&);
// For each symbol for which we should give a warning, make a note
// on the symbol.
void
- note_warnings(Symbol_table* symtab);
+ note_warnings(Symbol_table* symtab, const Task*);
// Issue a warning for a reference to SYM at RELINFO's location.
template<int size, bool big_endian>
}
void
- set_text(const char* t, off_t l)
+ set_text(const char* t, section_size_type l)
{ this->text.assign(t, l); }
};
class Symbol_table
{
public:
- Symbol_table();
+ // COUNT is an estimate of how many symbosl will be inserted in the
+ // symbol table. It's ok to put 0 if you don't know; a correct
+ // guess will just save some CPU by reducing hashtable resizes.
+ Symbol_table(unsigned int count);
~Symbol_table();
template<int size>
void
define_with_copy_reloc(const Target*, Sized_symbol<size>* sym,
- Output_data* posd, uint64_t value);
+ Output_data* posd,
+ typename elfcpp::Elf_types<size>::Elf_Addr);
// Look up a symbol.
Symbol*
// Check candidate_odr_violations_ to find symbols with the same name
// but apparently different definitions (different source-file/line-no).
void
- detect_odr_violations(const char* output_file_name) const;
+ detect_odr_violations(const Task*, const char* output_file_name) const;
// SYM is defined using a COPY reloc. Return the dynamic object
// where the original definition was found.
// symbol, and DYNCOUNT is the number of global dynamic symbols.
// This records the parameters, and returns the new file offset.
off_t
- finalize(unsigned int index, off_t off, off_t dynoff,
+ finalize(const Task*, unsigned int index, off_t off, off_t dynoff,
size_t dyn_global_index, size_t dyncount, Stringpool* pool);
// Write out the global symbols.
void
write_section_symbol(const Output_section*, Output_file*, off_t) const;
+ // Dump statistical information to stderr.
+ void
+ print_stats() const;
+
private:
Symbol_table(const Symbol_table&);
Symbol_table& operator=(const Symbol_table&);