Add plugin API for processing plugin-added input files
Gold plugins may wish to further process an input file added by a plugin. For example, the plugin may need to assign a unique segment for sections in a plugin-generated input file. This patch adds a plugin callback that the linker will call when reading symbols from a new input file added after the all_symbols_read event (i.e. an input file added by a plugin). 2017-12-11 Stephen Crane <sjc@immunant.com> * plugin-api.h: Add new plugin hook to allow processing of input files added by a plugin. (ld_plugin_new_input_handler): New function hook type. (ld_plugin_register_new_input): New interface. (LDPT_REGISTER_NEW_INPUT_HOOK): New enum val. (tv_register_new_input): New member. * plugin.cc (Plugin::load): Include hooks for register_new_input in transfer vector. (Plugin::new_input): New function. (register_new_input): New function. (Plugin_manager::claim_file): Call Plugin::new_input if in replacement phase. * plugin.h (Plugin::set_new_input_handler): New function. * testsuite/plugin_new_section_layout.c: New plugin to test new_input plugin API. * testsuite/plugin_final_layout.sh: Add new input test. * testsuite/Makefile.am (plugin_layout_new_file): New test case. * testsuite/Makefile.in: Regenerate.
This commit is contained in:
parent
4c5ae11b42
commit
c4e648430f
9 changed files with 333 additions and 20 deletions
|
@ -365,6 +365,20 @@ enum ld_plugin_status
|
|||
(*ld_plugin_get_input_section_size) (const struct ld_plugin_section section,
|
||||
uint64_t *secsize);
|
||||
|
||||
typedef
|
||||
enum ld_plugin_status
|
||||
(*ld_plugin_new_input_handler) (const struct ld_plugin_input_file *file);
|
||||
|
||||
/* The linker's interface for registering the "new_input" handler. This handler
|
||||
will be notified when a new input file has been added after the
|
||||
all_symbols_read event, allowing the plugin to, for example, set a unique
|
||||
segment for sections in plugin-generated input files. */
|
||||
|
||||
typedef
|
||||
enum ld_plugin_status
|
||||
(*ld_plugin_register_new_input) (ld_plugin_new_input_handler handler);
|
||||
|
||||
|
||||
enum ld_plugin_level
|
||||
{
|
||||
LDPL_INFO,
|
||||
|
@ -407,7 +421,8 @@ enum ld_plugin_tag
|
|||
LDPT_UNIQUE_SEGMENT_FOR_SECTIONS = 27,
|
||||
LDPT_GET_SYMBOLS_V3 = 28,
|
||||
LDPT_GET_INPUT_SECTION_ALIGNMENT = 29,
|
||||
LDPT_GET_INPUT_SECTION_SIZE = 30
|
||||
LDPT_GET_INPUT_SECTION_SIZE = 30,
|
||||
LDPT_REGISTER_NEW_INPUT_HOOK = 31
|
||||
};
|
||||
|
||||
/* The plugin transfer vector. */
|
||||
|
@ -441,6 +456,7 @@ struct ld_plugin_tv
|
|||
ld_plugin_unique_segment_for_sections tv_unique_segment_for_sections;
|
||||
ld_plugin_get_input_section_alignment tv_get_input_section_alignment;
|
||||
ld_plugin_get_input_section_size tv_get_input_section_size;
|
||||
ld_plugin_register_new_input tv_register_new_input;
|
||||
} tv_u;
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue