* layout.cc (Layout::Layout): Initialize dynamic_symbol_ field.
	(Layout::create_initial_dynamic_sections): Set dynamic_symbol_.
	(Layout::finalize): Call set_dynamic_symbol_size.
	(Layout::set_dynamic_symbol_size): New function.
	* layout.h (class Layout): Add dynamic_symbol_ field.  Declare
	set_dynamic_symbol_size.
This commit is contained in:
Ian Lance Taylor
2009-12-30 04:16:50 +00:00
parent e8cd95c71e
commit f0ba79e29c
3 changed files with 42 additions and 4 deletions

View File

@@ -180,6 +180,7 @@ Layout::Layout(int number_of_input_files, Script_options* script_options)
dynsym_section_(NULL),
dynsym_xindex_(NULL),
dynamic_section_(NULL),
dynamic_symbol_(NULL),
dynamic_data_(NULL),
eh_frame_section_(NULL),
eh_frame_data_(NULL),
@@ -1161,10 +1162,11 @@ Layout::create_initial_dynamic_sections(Symbol_table* symtab)
false, false, true);
this->dynamic_section_->set_is_relro();
symtab->define_in_output_data("_DYNAMIC", NULL, Symbol_table::PREDEFINED,
this->dynamic_section_, 0, 0,
elfcpp::STT_OBJECT, elfcpp::STB_LOCAL,
elfcpp::STV_HIDDEN, 0, false, false);
this->dynamic_symbol_ =
symtab->define_in_output_data("_DYNAMIC", NULL, Symbol_table::PREDEFINED,
this->dynamic_section_, 0, 0,
elfcpp::STT_OBJECT, elfcpp::STB_LOCAL,
elfcpp::STV_HIDDEN, 0, false, false);
this->dynamic_data_ = new Output_data_dynamic(&this->dynpool_);
@@ -1580,6 +1582,10 @@ Layout::finalize(const Input_objects* input_objects, Symbol_table* symtab,
// dynamic string table is complete.
this->create_version_sections(&versions, symtab, local_dynamic_count,
dynamic_symbols, dynstr);
// Set the size of the _DYNAMIC symbol. We can't do this until
// after we call create_version_sections.
this->set_dynamic_symbol_size(symtab);
}
if (this->incremental_inputs_)
@@ -3303,6 +3309,24 @@ Layout::finish_dynamic_section(const Input_objects* input_objects,
odyn->add_constant(elfcpp::DT_FLAGS_1, flags);
}
// Set the size of the _DYNAMIC symbol table to be the size of the
// dynamic data.
void
Layout::set_dynamic_symbol_size(const Symbol_table* symtab)
{
Output_data_dynamic* const odyn = this->dynamic_data_;
odyn->finalize_data_size();
off_t data_size = odyn->data_size();
const int size = parameters->target().get_size();
if (size == 32)
symtab->get_sized_symbol<32>(this->dynamic_symbol_)->set_symsize(data_size);
else if (size == 64)
symtab->get_sized_symbol<64>(this->dynamic_symbol_)->set_symsize(data_size);
else
gold_unreachable();
}
// The mapping of input section name prefixes to output section names.
// In some cases one prefix is itself a prefix of another prefix; in
// such a case the longer prefix must come first. These prefixes are