mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-27 01:28:46 +00:00
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:
@@ -983,18 +983,20 @@ Symbol_assignment::sized_finalize(Symbol_table* symtab, const Layout* layout,
|
||||
uint64_t final_val = this->val_->eval_maybe_dot(symtab, layout, true,
|
||||
is_dot_available,
|
||||
dot_value, dot_section,
|
||||
§ion, NULL);
|
||||
§ion, NULL, false);
|
||||
Sized_symbol<size>* ssym = symtab->get_sized_symbol<size>(this->sym_);
|
||||
ssym->set_value(final_val);
|
||||
if (section != NULL)
|
||||
ssym->set_output_section(section);
|
||||
}
|
||||
|
||||
// Set the symbol value if the expression yields an absolute value.
|
||||
// Set the symbol value if the expression yields an absolute value or
|
||||
// a value relative to DOT_SECTION.
|
||||
|
||||
void
|
||||
Symbol_assignment::set_if_absolute(Symbol_table* symtab, const Layout* layout,
|
||||
bool is_dot_available, uint64_t dot_value)
|
||||
bool is_dot_available, uint64_t dot_value,
|
||||
Output_section* dot_section)
|
||||
{
|
||||
if (this->sym_ == NULL)
|
||||
return;
|
||||
@@ -1002,8 +1004,9 @@ Symbol_assignment::set_if_absolute(Symbol_table* symtab, const Layout* layout,
|
||||
Output_section* val_section;
|
||||
uint64_t val = this->val_->eval_maybe_dot(symtab, layout, false,
|
||||
is_dot_available, dot_value,
|
||||
NULL, &val_section, NULL);
|
||||
if (val_section != NULL)
|
||||
dot_section, &val_section, NULL,
|
||||
false);
|
||||
if (val_section != NULL && val_section != dot_section)
|
||||
return;
|
||||
|
||||
if (parameters->target().get_size() == 32)
|
||||
@@ -1026,6 +1029,8 @@ Symbol_assignment::set_if_absolute(Symbol_table* symtab, const Layout* layout,
|
||||
}
|
||||
else
|
||||
gold_unreachable();
|
||||
if (val_section != NULL)
|
||||
this->sym_->set_output_section(val_section);
|
||||
}
|
||||
|
||||
// Print for debugging.
|
||||
@@ -1215,7 +1220,7 @@ Script_options::set_section_addresses(Symbol_table* symtab, Layout* layout)
|
||||
for (Symbol_assignments::iterator p = this->symbol_assignments_.begin();
|
||||
p != this->symbol_assignments_.end();
|
||||
++p)
|
||||
(*p)->set_if_absolute(symtab, layout, false, 0);
|
||||
(*p)->set_if_absolute(symtab, layout, false, 0, NULL);
|
||||
|
||||
return this->script_sections_.set_section_addresses(symtab, layout);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user