// script.h -- handle linker scripts for gold -*- C++ -*-
-// Copyright 2006, 2007, 2008, 2009, 2010 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.
#include <string>
#include <vector>
+#include "elfcpp.h"
#include "script-sections.h"
namespace gold
struct Version_tree;
struct Version_expression;
class Lazy_demangler;
+class Incremental_script_entry;
// This class represents an expression in a linker script.
// the section address. If RESULT_ALIGNMENT is not NULL, this sets
// *RESULT_ALIGNMENT to the alignment of the value of that alignment
// is larger than *RESULT_ALIGNMENT; this will only be non-zero if
- // this is an ALIGN expression.
+ // this is an ALIGN expression. If IS_SECTION_DOT_ASSIGMENT is true,
+ // we are evaluating an assignment to dot within an output section,
+ // and an absolute value should be interpreted as an offset within
+ // the section.
uint64_t
eval_with_dot(const Symbol_table*, const Layout*, bool check_assertions,
uint64_t dot_value, Output_section* dot_section,
- Output_section** result_section, uint64_t* result_alignment);
+ Output_section** result_section, uint64_t* result_alignment,
+ bool is_section_dot_assignment);
// Return the value of an expression which may or may not be
// permitted to refer to the dot symbol, depending on
- // is_dot_available.
+ // is_dot_available. If IS_SECTION_DOT_ASSIGMENT is true,
+ // we are evaluating an assignment to dot within an output section,
+ // and an absolute value should be interpreted as an offset within
+ // the section.
uint64_t
eval_maybe_dot(const Symbol_table*, const Layout*, bool check_assertions,
bool is_dot_available, uint64_t dot_value,
Output_section* dot_section,
- Output_section** result_section, uint64_t* result_alignment);
+ Output_section** result_section, uint64_t* result_alignment,
+ elfcpp::STT* type, elfcpp::STV* vis, unsigned char* nonvis,
+ bool is_section_dot_assignment, bool* is_valid_pointer);
// Print the expression to the FILE. This is for debugging.
virtual void
virtual uint64_t
value(const Expression_eval_info*) = 0;
+ // Sets all symbols used in expressions as seen in a real ELF object.
+ virtual void
+ set_expr_sym_in_real_elf(Symbol_table*) const
+ { return; }
+
private:
// May not be copied.
Expression(const Expression&);
Expression& operator=(const Expression&);
};
-
// Version_script_info stores information parsed from the version
// script, either provided by --version-script or as part of a linker
// script. A single Version_script_info object per target is owned by
void
finalize(Symbol_table*, const Layout*);
+ bool
+ is_defsym() const
+ { return is_defsym_; }
+
+ Expression *
+ value() const
+ { return val_; }
+
// Finalize the symbol value when it can refer to the dot symbol.
void
finalize_with_dot(Symbol_table*, const Layout*, uint64_t dot_value,
Output_section* dot_section);
- // Set the symbol value, but only if the value is absolute. This is
- // used while processing a SECTIONS clause. We assume that dot is
- // an absolute value here. We do not check assertions.
+ // Set the symbol value, but only if the value is absolute or relative to
+ // DOT_SECTION. This is used while processing a SECTIONS clause.
+ // We assume that dot is an absolute value here. We do not check assertions.
void
set_if_absolute(Symbol_table*, const Layout*, bool is_dot_available,
- uint64_t dot_value);
+ uint64_t dot_value, Output_section* dot_section);
+
+ const std::string&
+ name() const
+ { return this->name_; }
// Print the assignment to the FILE. This is for debugging.
void
add_symbol_assignment(const char* name, size_t length, bool is_defsym,
Expression* value, bool provide, bool hidden);
+ // Look for an assigned symbol.
+ bool
+ is_pending_assignment(const char* name);
+
// Add a reference to a symbol.
void
add_symbol_reference(const char* name, size_t length);
bool
define_symbol(const char* definition);
+ // Populates the set with symbol names used in LHS of defsym.
+ void
+ find_defsym_defs(Unordered_set<std::string>&);
+
+ // Set symbols used in defsym expressions as seen in a real ELF object.
+ void set_defsym_uses_in_real_elf(Symbol_table*) const;
+
// Create sections required by any linker scripts.
void
create_script_sections(Layout*);
// SECTIONS clause.
typedef std::vector<Symbol_assignment*> Symbol_assignments;
- // We keep a list of all assertions whcih occur outside of a
+ // We keep a list of all assertions which occur outside of a
// SECTIONS clause.
typedef std::vector<Script_assertion*> Assertions;
Script_sections script_sections_;
};
-// Information about a script input that will persist during the whole linker
-// run. Needed only during an incremental build to retrieve the input files
-// added by this script.
-
-class Script_info
-{
- public:
- Script_info(Input_arguments* inputs)
- : inputs_(inputs)
- { }
-
- // Returns the input files included because of this script.
- Input_arguments*
- inputs()
- { return this->inputs_; }
-
- private:
- Input_arguments* inputs_;
-};
-
// FILE was found as an argument on the command line, but was not
// recognized as an ELF file. Try to read it as a script. Return
// true if the file was handled. This has to handle /usr/lib/libc.so