forked from Imagelibrary/binutils-gdb
PR gold/13023
* expression.cc (Expression::eval_with_dot): Add is_section_dot_assignment parameter. (Expression::eval_maybe_dot): Likewise. Adjust value when rhs is absolute and assigning to dot within a section. * script-sections.cc (Output_section_element_assignment::set_section_addresses): Pass dot_section to set_if_absolute. (Output_section_element_dot_assignment::finalize_symbols): Pass TRUE as is_section_dot_assignment flag to eval_with_dot. (Output_section_element_dot_assignment::set_section_addresses): Likewise. * script.cc (Symbol_assignment::set_if_absolute): Add dot_section parameter. Also set value if relative to dot_section; set the symbol's output_section. * script.h (Expression::eval_with_dot): Add is_section_dot_assignment parameter. Adjust all callers. (Expression::eval_maybe_dot): Likewise. (Symbol_assignment::set_if_absolute): Add dot_section parameter. Adjust all callers. * testsuite/script_test_2.t: Test assignment of an absolute value to dot within an output section element.
This commit is contained in:
@@ -90,20 +90,28 @@ class Expression
|
||||
// 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,
|
||||
bool is_section_dot_assignment);
|
||||
|
||||
// Print the expression to the FILE. This is for debugging.
|
||||
virtual void
|
||||
@@ -339,12 +347,12 @@ class Symbol_assignment
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user