forked from Imagelibrary/binutils-gdb
2011-07-13 Sriraman Tallam <tmsriram@google.com>
* plugin-api.h (ld_plugin_section): New struct. (ld_plugin_get_section_count): New typedef. (ld_plugin_get_section_type): New typedef. (ld_plugin_get_section_name): New typedef. (ld_plugin_get_section_contents): New typedef. (ld_plugin_update_section_order): New typedef. (ld_plugin_allow_section_ordering): New typedef. (LDPT_GET_SECTION_COUNT): New enum value. (LDPT_GET_SECTION_TYPE): New enum value. (LDPT_GET_SECTION_NAME): New enum value. (LDPT_GET_SECTION_CONTENTS): New enum value. (LDPT_UPDATE_SECTION_ORDER): New enum value. (LDPT_ALLOW_SECTION_ORDERING): New enum value. (tv_get_section_count): New struct members. (tv_get_section_type): New struct members. (tv_get_section_name): New struct members. (tv_get_section_contents): New struct members. (tv_update_section_order): New struct members. (tv_allow_section_ordering): New struct members. * archive.cc (Archive::get_elf_object_for_member): Add extra parameter to claim_file call. * layout.cc (Layout::Layout): Initialize section_ordering_specified_, input_section_position_, and input_section_glob_. (read_layout_from_file): Call function section_ordering_specified. * layout.h (is_section_ordering_specified): New function. (section_ordering_specified): New function. (section_ordering_specified_): New boolean member. * main.cc(main): Call load_plugins after layout object is defined. * output.cc (Output_section::add_input_section): Use function section_ordering_specified to check if section ordering is needed. * output.cc (Output_section::add_relaxed_input_section): Use function section_ordering_specified to check if section ordering is needed. (Output_section::update_section_layout): New function. (Output_section::sort_attached_input_sections): Check if input section must be reordered. * output.h (Output_section::update_section_layout): New function. * plugin.cc (get_section_count): New function. (get_section_type): New function. (get_section_name): New function. (get_section_contents): New function. (update_section_order): New function. (allow_section_ordering): New function. (Plugin::load): Add the new interfaces to the transfer vector. (Plugin_manager::load_plugins): New parameter. (Plugin_manager::all_symbols_read): New parameter. (Plugin_manager::claim_file): New parameter. Save the elf object for unclaimed objects. (Plugin_manager::get_elf_object): New function. (Plugin_manager::get_view): Change to directly use the bool to check if get_view is called from claim_file_hook. * plugin.h (input_objects): New function (Plugin__manager::load_plugins): New parameter. (Plugin_manager::claim_file): New parameter. (Plugin_manager::get_elf_object): New function. (Plugin_manager::in_claim_file_handler): New function. (Plugin_manager::in_claim_file_handler_): New member. (layout): New function. * readsyms.cc (Read_symbols::do_read_symbols): Call the claim_file handler with an extra parameter. Make the elf object before calling claim_file handler. * testsuite/plugin_test.c (get_section_count): New function pointer. (get_section_type): New function pointer. (get_section_name): New function pointer. (get_section_contents): New function pointer. (update_section_order): New function pointer. (allow_section_ordering): New function pointer. (onload): Check if the new interfaces exist.
This commit is contained in:
@@ -2296,7 +2296,7 @@ Output_section::add_input_section(Layout* layout,
|
||||
&& (sh_flags & elfcpp::SHF_EXECINSTR) != 0
|
||||
&& parameters->target().has_code_fill()
|
||||
&& (parameters->target().may_relax()
|
||||
|| parameters->options().section_ordering_file()))
|
||||
|| layout->is_section_ordering_specified()))
|
||||
{
|
||||
gold_assert(this->fills_.empty());
|
||||
this->generate_code_fills_at_write_ = true;
|
||||
@@ -2335,10 +2335,10 @@ Output_section::add_input_section(Layout* layout,
|
||||
|| this->must_sort_attached_input_sections()
|
||||
|| parameters->options().user_set_Map()
|
||||
|| parameters->target().may_relax()
|
||||
|| parameters->options().section_ordering_file())
|
||||
|| layout->is_section_ordering_specified())
|
||||
{
|
||||
Input_section isecn(object, shndx, input_section_size, addralign);
|
||||
if (parameters->options().section_ordering_file())
|
||||
if (layout->is_section_ordering_specified())
|
||||
{
|
||||
unsigned int section_order_index =
|
||||
layout->find_section_order_index(std::string(secname));
|
||||
@@ -2421,7 +2421,7 @@ Output_section::add_relaxed_input_section(Layout* layout,
|
||||
|
||||
// If the --section-ordering-file option is used to specify the order of
|
||||
// sections, we need to keep track of sections.
|
||||
if (parameters->options().section_ordering_file())
|
||||
if (layout->is_section_ordering_specified())
|
||||
{
|
||||
unsigned int section_order_index =
|
||||
layout->find_section_order_index(name);
|
||||
@@ -3339,6 +3339,38 @@ Output_section::Input_section_sort_section_order_index_compare::operator()(
|
||||
return s1_secn_index < s2_secn_index;
|
||||
}
|
||||
|
||||
// This updates the section order index of input sections according to the
|
||||
// the order specified in the mapping from Section id to order index.
|
||||
|
||||
void
|
||||
Output_section::update_section_layout(
|
||||
const Section_layout_order& order_map)
|
||||
{
|
||||
for (Input_section_list::iterator p = this->input_sections_.begin();
|
||||
p != this->input_sections_.end();
|
||||
++p)
|
||||
{
|
||||
if (p->is_input_section()
|
||||
|| p->is_relaxed_input_section())
|
||||
{
|
||||
Object* obj = (p->is_input_section()
|
||||
? p->relobj()
|
||||
: p->relaxed_input_section()->relobj());
|
||||
unsigned int shndx = p->shndx();
|
||||
Section_layout_order::const_iterator it
|
||||
= order_map.find(Section_id(obj, shndx));
|
||||
if (it == order_map.end())
|
||||
continue;
|
||||
unsigned int section_order_index = it->second;
|
||||
if (section_order_index != 0)
|
||||
{
|
||||
p->set_section_order_index(section_order_index);
|
||||
this->set_input_section_order_specified();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Sort the input sections attached to an output section.
|
||||
|
||||
void
|
||||
@@ -3381,7 +3413,7 @@ Output_section::sort_attached_input_sections()
|
||||
}
|
||||
else
|
||||
{
|
||||
gold_assert(parameters->options().section_ordering_file());
|
||||
gold_assert(this->input_section_order_specified());
|
||||
std::sort(sort_list.begin(), sort_list.end(),
|
||||
Input_section_sort_section_order_index_compare());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user