ld: Add -plugin-save-temps

Add -plugin-save-temps to store plugin intermediate files permanently.
It can be used to exam the final input object files generated from IR
inputs.

	* NEWS: Mention -plugin-save-temps.
	* ld.h (ld_config_type): Add plugin_save_temps.
	* ld.texi: Document -plugin-save-temps.
	* ldlex.h (option_values): Add OPTION_PLUGIN_SAVE_TEMPS.
	* lexsup.c (ld_options): Add -plugin-save-temps.
	(parse_args): Handle OPTION_PLUGIN_SAVE_TEMPS.
	* plugin.c (plugin_call_cleanup): Don't call plugin
	cleanup_handler for -plugin-save-temps.
This commit is contained in:
H.J. Lu
2020-10-26 04:36:59 -07:00
parent 900c0f0aa3
commit d9511b64b8
6 changed files with 27 additions and 8 deletions

View File

@@ -1,5 +1,7 @@
-*- text -*- -*- text -*-
* Add -plugin-save-temps to store plugin intermediate files permanently.
Changes in 2.42: Changes in 2.42:
* Add -z mark-plt/-z nomark-plt options to x86-64 ELF linker to mark PLT * Add -z mark-plt/-z nomark-plt options to x86-64 ELF linker to mark PLT

View File

@@ -300,6 +300,9 @@ typedef struct
/* The size of the hash table to use. */ /* The size of the hash table to use. */
unsigned long hash_table_size; unsigned long hash_table_size;
/* If set, store plugin intermediate files permanently. */
bool plugin_save_temps;
/* If set, print discarded sections in map file output. */ /* If set, print discarded sections in map file output. */
bool print_map_discarded; bool print_map_discarded;

View File

@@ -1140,6 +1140,10 @@ Omit debugger symbol information (but not all symbols) from the output file.
Omit (or do not omit) global symbols defined in discarded sections. Omit (or do not omit) global symbols defined in discarded sections.
Enabled by default. Enabled by default.
@kindex -plugin-save-temps
@item -plugin-save-temps
Store the plugin ``temporary'' intermediate files permanently.
@kindex -t @kindex -t
@kindex --trace @kindex --trace
@cindex input files, displaying @cindex input files, displaying

View File

@@ -146,6 +146,7 @@ enum option_values
#if BFD_SUPPORTS_PLUGINS #if BFD_SUPPORTS_PLUGINS
OPTION_PLUGIN, OPTION_PLUGIN,
OPTION_PLUGIN_OPT, OPTION_PLUGIN_OPT,
OPTION_PLUGIN_SAVE_TEMPS,
#endif /* BFD_SUPPORTS_PLUGINS */ #endif /* BFD_SUPPORTS_PLUGINS */
OPTION_DEFAULT_SCRIPT, OPTION_DEFAULT_SCRIPT,
OPTION_PRINT_OUTPUT_FORMAT, OPTION_PRINT_OUTPUT_FORMAT,

View File

@@ -187,6 +187,9 @@ static const struct ld_option ld_options[] =
'\0', N_("PLUGIN"), N_("Load named plugin"), ONE_DASH }, '\0', N_("PLUGIN"), N_("Load named plugin"), ONE_DASH },
{ {"plugin-opt", required_argument, NULL, OPTION_PLUGIN_OPT}, { {"plugin-opt", required_argument, NULL, OPTION_PLUGIN_OPT},
'\0', N_("ARG"), N_("Send arg to last-loaded plugin"), ONE_DASH }, '\0', N_("ARG"), N_("Send arg to last-loaded plugin"), ONE_DASH },
{ {"plugin-save-temps", no_argument, NULL, OPTION_PLUGIN_SAVE_TEMPS},
'\0', NULL, N_("Store plugin intermediate files permanently"),
ONE_DASH },
{ {"flto", optional_argument, NULL, OPTION_IGNORE}, { {"flto", optional_argument, NULL, OPTION_IGNORE},
'\0', NULL, N_("Ignored for GCC LTO option compatibility"), '\0', NULL, N_("Ignored for GCC LTO option compatibility"),
ONE_DASH }, ONE_DASH },
@@ -1211,6 +1214,9 @@ parse_args (unsigned argc, char **argv)
if (plugin_opt_plugin_arg (optarg)) if (plugin_opt_plugin_arg (optarg))
einfo (_("%F%P: bad -plugin-opt option\n")); einfo (_("%F%P: bad -plugin-opt option\n"));
break; break;
case OPTION_PLUGIN_SAVE_TEMPS:
config.plugin_save_temps = true;
break;
#endif /* BFD_SUPPORTS_PLUGINS */ #endif /* BFD_SUPPORTS_PLUGINS */
case 'q': case 'q':
link_info.emitrelocations = true; link_info.emitrelocations = true;

View File

@@ -1366,6 +1366,8 @@ plugin_call_cleanup (void)
while (curplug) while (curplug)
{ {
if (curplug->cleanup_handler && !curplug->cleanup_done) if (curplug->cleanup_handler && !curplug->cleanup_done)
{
if (!config.plugin_save_temps)
{ {
enum ld_plugin_status rv; enum ld_plugin_status rv;
curplug->cleanup_done = true; curplug->cleanup_done = true;
@@ -1375,6 +1377,7 @@ plugin_call_cleanup (void)
if (rv != LDPS_OK) if (rv != LDPS_OK)
info_msg (_("%P: %s: error in plugin cleanup: %d (ignored)\n"), info_msg (_("%P: %s: error in plugin cleanup: %d (ignored)\n"),
curplug->name, rv); curplug->name, rv);
}
dlclose (curplug->dlhandle); dlclose (curplug->dlhandle);
} }
curplug = curplug->next; curplug = curplug->next;