// dynobj.h -- dynamic object support for gold -*- C++ -*-
-// Copyright 2006, 2007, 2008 Free Software Foundation, Inc.
+// Copyright (C) 2006-2018 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.
// This file is part of gold.
this->unknown_needed_ = set ? UNKNOWN_NEEDED_TRUE : UNKNOWN_NEEDED_FALSE;
}
+ // Return the word size of the object file.
+ int
+ elfsize() const
+ { gold_unreachable(); }
+
+ // Return TRUE if this is a big-endian object file.
+ bool
+ is_big_endian() const
+ { gold_unreachable(); }
+
// Compute the ELF hash code for a string.
static uint32_t
elf_hash(const char*);
unsigned char** pphash, unsigned int* phashlen);
protected:
+ // Return a pointer to this object.
+ virtual Dynobj*
+ do_dynobj()
+ { return this; }
+
// Set the DT_SONAME string.
void
set_soname_string(const char* s)
bool for_gnu_hash_table);
// Sized version of create_elf_hash_table.
- template<bool big_endian>
+ template<int size, bool big_endian>
static void
sized_create_elf_hash_table(const std::vector<uint32_t>& bucket,
const std::vector<uint32_t>& chain,
class Sized_dynobj : public Dynobj
{
public:
- typedef typename Sized_relobj<size, big_endian>::Symbols Symbols;
+ typedef typename Sized_relobj_file<size, big_endian>::Symbols Symbols;
Sized_dynobj(const std::string& name, Input_file* input_file, off_t offset,
const typename elfcpp::Ehdr<size, big_endian>&);
void
do_add_symbols(Symbol_table*, Read_symbols_data*, Layout*);
+ Archive::Should_include
+ do_should_include_member(Symbol_table* symtab, Layout*, Read_symbols_data*,
+ std::string* why);
+
+ // Iterate over global symbols, calling a visitor class V for each.
+ void
+ do_for_all_global_symbols(Read_symbols_data* sd,
+ Library_base::Symbol_visitor_base* v);
+
+ // Iterate over local symbols, calling a visitor class V for each GOT offset
+ // associated with a local symbol.
+ void
+ do_for_all_local_got_entries(Got_offset_list::Visitor* v) const;
+
// Get the size of a section.
uint64_t
do_section_size(unsigned int shndx)
// Get the name of a section.
std::string
- do_section_name(unsigned int shndx)
+ do_section_name(unsigned int shndx) const
{ return this->elf_file_.section_name(shndx); }
// Return a view of the contents of a section. Set *PLEN to the
// size.
- Object::Location
- do_section_contents(unsigned int shndx)
- { return this->elf_file_.section_contents(shndx); }
+ const unsigned char*
+ do_section_contents(unsigned int shndx, section_size_type* plen,
+ bool cache)
+ {
+ Location loc(this->elf_file_.section_contents(shndx));
+ *plen = convert_to_section_size_type(loc.data_size);
+ if (*plen == 0)
+ {
+ static const unsigned char empty[1] = { '\0' };
+ return empty;
+ }
+ return this->get_view(loc.file_offset, *plen, true, cache);
+ }
// Return section flags.
uint64_t
void
do_get_global_symbol_counts(const Symbol_table*, size_t*, size_t*) const;
+ // Get the global symbols.
+ const Symbols*
+ do_get_global_symbols() const
+ { return this->symbols_; }
+
+ protected:
+ // Read the symbols. This is common code for all target-specific
+ // overrides of do_read_symbols().
+ void
+ base_read_symbols(Read_symbols_data*);
+
private:
// For convenience.
typedef Sized_dynobj<size, big_endian> This;
// Set the version index.
void
- set_index(unsigned int vindex)
+ set_index(unsigned int index)
{
gold_assert(this->index_ == -1U);
- this->index_ = vindex;
+ this->index_ = index;
}
// Clear the weak flag in a version definition.
class Verdef : public Version_base
{
public:
- Verdef(const char* vname, const std::vector<std::string>& deps,
- bool is_base, bool vis_weak, bool vis_symbol_created)
- : name_(vname), deps_(deps), is_base_(is_base), is_weak_(vis_weak),
- is_symbol_created_(vis_symbol_created)
+ Verdef(const char* name, const std::vector<std::string>& deps,
+ bool is_base, bool is_weak, bool is_info, bool is_symbol_created)
+ : name_(name), deps_(deps), is_base_(is_base), is_weak_(is_weak),
+ is_info_(is_info), is_symbol_created_(is_symbol_created)
{ }
// Return the version name.
// Add a dependency to this version. The NAME should be
// canonicalized in the dynamic Stringpool.
void
- add_dependency(const char* dname)
- { this->deps_.push_back(dname); }
+ add_dependency(const char* name)
+ { this->deps_.push_back(name); }
// Return whether this definition is weak.
bool
clear_weak()
{ this->is_weak_ = false; }
+ // Return whether this definition is informational.
+ bool
+ is_info() const
+ { return this->is_info_; }
+
// Return whether a version symbol has been created for this
// definition.
bool
bool is_base_;
// Whether this version is weak.
bool is_weak_;
+ // Whether this version is informational.
+ bool is_info_;
// Whether a version symbol has been created.
bool is_symbol_created_;
};
class Verneed_version : public Version_base
{
public:
- Verneed_version(const char* ver)
- : version_(ver)
+ Verneed_version(const char* version)
+ : version_(version)
{ }
// Return the version name.
class Verneed
{
public:
- Verneed(const char* fname)
- : filename_(fname), need_versions_()
+ Verneed(const char* filename)
+ : filename_(filename), need_versions_()
{ }
~Verneed();
// Handle a symbol SYM defined with version VERSION.
void
- add_def(const Symbol* sym, const char* version, Stringpool::Key);
+ add_def(Stringpool*, const Symbol* sym, const char* version,
+ Stringpool::Key);
// Add a reference to version NAME in file FILENAME.
void
// Contents of --version-script, if passed, or NULL.
const Version_script_info& version_script_;
// Whether we need to insert a base version. This is only used for
- // shared libaries and is cleared when the base version is defined.
+ // shared libraries and is cleared when the base version is defined.
bool needs_base_version_;
};