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:
Cary Coutant
2011-10-31 22:51:03 +00:00
parent 9634ed06a6
commit 286adcf4f8
6 changed files with 108 additions and 44 deletions

View File

@@ -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