Fully implement the SECTIONS clause.

This commit is contained in:
Ian Lance Taylor
2008-02-04 05:43:05 +00:00
parent d16c732117
commit a445fddf82
24 changed files with 3087 additions and 441 deletions

View File

@@ -298,6 +298,25 @@ Symbol::final_value_is_known() const
return parameters->doing_static_link();
}
// Return whether the symbol has an absolute value.
bool
Symbol::value_is_absolute() const
{
switch (this->source_)
{
case FROM_OBJECT:
return this->u_.from_object.shndx == elfcpp::SHN_ABS;
case IN_OUTPUT_DATA:
case IN_OUTPUT_SEGMENT:
return false;
case CONSTANT:
return true;
default:
gold_unreachable();
}
}
// Class Symbol_table.
Symbol_table::Symbol_table(unsigned int count,
@@ -1336,7 +1355,8 @@ Symbol_table::do_define_as_constant(
void
Symbol_table::define_symbols(const Layout* layout, int count,
const Define_symbol_in_section* p)
const Define_symbol_in_section* p,
bool only_if_ref)
{
for (int i = 0; i < count; ++i, ++p)
{
@@ -1345,11 +1365,12 @@ Symbol_table::define_symbols(const Layout* layout, int count,
this->define_in_output_data(p->name, NULL, os, p->value,
p->size, p->type, p->binding,
p->visibility, p->nonvis,
p->offset_is_from_end, p->only_if_ref);
p->offset_is_from_end,
only_if_ref || p->only_if_ref);
else
this->define_as_constant(p->name, NULL, 0, p->size, p->type,
p->binding, p->visibility, p->nonvis,
p->only_if_ref);
only_if_ref || p->only_if_ref);
}
}
@@ -1357,7 +1378,8 @@ Symbol_table::define_symbols(const Layout* layout, int count,
void
Symbol_table::define_symbols(const Layout* layout, int count,
const Define_symbol_in_segment* p)
const Define_symbol_in_segment* p,
bool only_if_ref)
{
for (int i = 0; i < count; ++i, ++p)
{
@@ -1368,11 +1390,12 @@ Symbol_table::define_symbols(const Layout* layout, int count,
this->define_in_output_segment(p->name, NULL, os, p->value,
p->size, p->type, p->binding,
p->visibility, p->nonvis,
p->offset_base, p->only_if_ref);
p->offset_base,
only_if_ref || p->only_if_ref);
else
this->define_as_constant(p->name, NULL, 0, p->size, p->type,
p->binding, p->visibility, p->nonvis,
p->only_if_ref);
only_if_ref || p->only_if_ref);
}
}