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:
@@ -60,6 +60,12 @@ static ld_plugin_add_input_file add_input_file = NULL;
|
||||
static ld_plugin_message message = NULL;
|
||||
static ld_plugin_get_input_file get_input_file = NULL;
|
||||
static ld_plugin_release_input_file release_input_file = NULL;
|
||||
static ld_plugin_get_input_section_count get_input_section_count = NULL;
|
||||
static ld_plugin_get_input_section_type get_input_section_type = NULL;
|
||||
static ld_plugin_get_input_section_name get_input_section_name = NULL;
|
||||
static ld_plugin_get_input_section_contents get_input_section_contents = NULL;
|
||||
static ld_plugin_update_section_order update_section_order = NULL;
|
||||
static ld_plugin_allow_section_ordering allow_section_ordering = NULL;
|
||||
|
||||
#define MAXOPTS 10
|
||||
|
||||
@@ -126,6 +132,24 @@ onload(struct ld_plugin_tv *tv)
|
||||
case LDPT_RELEASE_INPUT_FILE:
|
||||
release_input_file = entry->tv_u.tv_release_input_file;
|
||||
break;
|
||||
case LDPT_GET_INPUT_SECTION_COUNT:
|
||||
get_input_section_count = *entry->tv_u.tv_get_input_section_count;
|
||||
break;
|
||||
case LDPT_GET_INPUT_SECTION_TYPE:
|
||||
get_input_section_type = *entry->tv_u.tv_get_input_section_type;
|
||||
break;
|
||||
case LDPT_GET_INPUT_SECTION_NAME:
|
||||
get_input_section_name = *entry->tv_u.tv_get_input_section_name;
|
||||
break;
|
||||
case LDPT_GET_INPUT_SECTION_CONTENTS:
|
||||
get_input_section_contents = *entry->tv_u.tv_get_input_section_contents;
|
||||
break;
|
||||
case LDPT_UPDATE_SECTION_ORDER:
|
||||
update_section_order = *entry->tv_u.tv_update_section_order;
|
||||
break;
|
||||
case LDPT_ALLOW_SECTION_ORDERING:
|
||||
allow_section_ordering = *entry->tv_u.tv_allow_section_ordering;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -179,6 +203,42 @@ onload(struct ld_plugin_tv *tv)
|
||||
return LDPS_ERR;
|
||||
}
|
||||
|
||||
if (get_input_section_count == NULL)
|
||||
{
|
||||
fprintf(stderr, "tv_get_input_section_count interface missing\n");
|
||||
return LDPS_ERR;
|
||||
}
|
||||
|
||||
if (get_input_section_type == NULL)
|
||||
{
|
||||
fprintf(stderr, "tv_get_input_section_type interface missing\n");
|
||||
return LDPS_ERR;
|
||||
}
|
||||
|
||||
if (get_input_section_name == NULL)
|
||||
{
|
||||
fprintf(stderr, "tv_get_input_section_name interface missing\n");
|
||||
return LDPS_ERR;
|
||||
}
|
||||
|
||||
if (get_input_section_contents == NULL)
|
||||
{
|
||||
fprintf(stderr, "tv_get_input_section_contents interface missing\n");
|
||||
return LDPS_ERR;
|
||||
}
|
||||
|
||||
if (update_section_order == NULL)
|
||||
{
|
||||
fprintf(stderr, "tv_update_section_order interface missing\n");
|
||||
return LDPS_ERR;
|
||||
}
|
||||
|
||||
if (allow_section_ordering == NULL)
|
||||
{
|
||||
fprintf(stderr, "tv_allow_section_ordering interface missing\n");
|
||||
return LDPS_ERR;
|
||||
}
|
||||
|
||||
return LDPS_OK;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user