// script.h -- handle linker scripts for gold -*- C++ -*-
-// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+// Copyright (C) 2006-2017 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
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);
// 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