mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2024-11-24 12:39:59 +00:00
PR 10450
* 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:
parent
e8cd95c71e
commit
f0ba79e29c
@ -1,5 +1,13 @@
|
|||||||
2009-12-29 Ian Lance Taylor <iant@google.com>
|
2009-12-29 Ian Lance Taylor <iant@google.com>
|
||||||
|
|
||||||
|
PR 10450
|
||||||
|
* 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.
|
||||||
|
|
||||||
PR 10450
|
PR 10450
|
||||||
* output.h (class Output_section): Add is_entsize_zero_ field.
|
* output.h (class Output_section): Add is_entsize_zero_ field.
|
||||||
* output.cc (Output_section::Output_section): Initialize
|
* output.cc (Output_section::Output_section): Initialize
|
||||||
|
@ -180,6 +180,7 @@ Layout::Layout(int number_of_input_files, Script_options* script_options)
|
|||||||
dynsym_section_(NULL),
|
dynsym_section_(NULL),
|
||||||
dynsym_xindex_(NULL),
|
dynsym_xindex_(NULL),
|
||||||
dynamic_section_(NULL),
|
dynamic_section_(NULL),
|
||||||
|
dynamic_symbol_(NULL),
|
||||||
dynamic_data_(NULL),
|
dynamic_data_(NULL),
|
||||||
eh_frame_section_(NULL),
|
eh_frame_section_(NULL),
|
||||||
eh_frame_data_(NULL),
|
eh_frame_data_(NULL),
|
||||||
@ -1161,10 +1162,11 @@ Layout::create_initial_dynamic_sections(Symbol_table* symtab)
|
|||||||
false, false, true);
|
false, false, true);
|
||||||
this->dynamic_section_->set_is_relro();
|
this->dynamic_section_->set_is_relro();
|
||||||
|
|
||||||
symtab->define_in_output_data("_DYNAMIC", NULL, Symbol_table::PREDEFINED,
|
this->dynamic_symbol_ =
|
||||||
this->dynamic_section_, 0, 0,
|
symtab->define_in_output_data("_DYNAMIC", NULL, Symbol_table::PREDEFINED,
|
||||||
elfcpp::STT_OBJECT, elfcpp::STB_LOCAL,
|
this->dynamic_section_, 0, 0,
|
||||||
elfcpp::STV_HIDDEN, 0, false, false);
|
elfcpp::STT_OBJECT, elfcpp::STB_LOCAL,
|
||||||
|
elfcpp::STV_HIDDEN, 0, false, false);
|
||||||
|
|
||||||
this->dynamic_data_ = new Output_data_dynamic(&this->dynpool_);
|
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.
|
// dynamic string table is complete.
|
||||||
this->create_version_sections(&versions, symtab, local_dynamic_count,
|
this->create_version_sections(&versions, symtab, local_dynamic_count,
|
||||||
dynamic_symbols, dynstr);
|
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_)
|
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);
|
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.
|
// The mapping of input section name prefixes to output section names.
|
||||||
// In some cases one prefix is itself a prefix of another prefix; in
|
// 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
|
// such a case the longer prefix must come first. These prefixes are
|
||||||
|
@ -708,6 +708,10 @@ class Layout
|
|||||||
void
|
void
|
||||||
finish_dynamic_section(const Input_objects*, const Symbol_table*);
|
finish_dynamic_section(const Input_objects*, const Symbol_table*);
|
||||||
|
|
||||||
|
// Set the size of the _DYNAMIC symbol.
|
||||||
|
void
|
||||||
|
set_dynamic_symbol_size(const Symbol_table*);
|
||||||
|
|
||||||
// Create the .interp section and PT_INTERP segment.
|
// Create the .interp section and PT_INTERP segment.
|
||||||
void
|
void
|
||||||
create_interp(const Target* target);
|
create_interp(const Target* target);
|
||||||
@ -947,6 +951,8 @@ class Layout
|
|||||||
Output_symtab_xindex* dynsym_xindex_;
|
Output_symtab_xindex* dynsym_xindex_;
|
||||||
// The SHT_DYNAMIC output section if there is one.
|
// The SHT_DYNAMIC output section if there is one.
|
||||||
Output_section* dynamic_section_;
|
Output_section* dynamic_section_;
|
||||||
|
// The _DYNAMIC symbol if there is one.
|
||||||
|
Symbol* dynamic_symbol_;
|
||||||
// The dynamic data which goes into dynamic_section_.
|
// The dynamic data which goes into dynamic_section_.
|
||||||
Output_data_dynamic* dynamic_data_;
|
Output_data_dynamic* dynamic_data_;
|
||||||
// The exception frame output section if there is one.
|
// The exception frame output section if there is one.
|
||||||
|
Loading…
Reference in New Issue
Block a user