From 727a29badd95a68d08b86fec0b98702ce756c660 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 29 Oct 2018 18:10:06 +1030 Subject: [PATCH] Report scripts and libraries searched for ld --trace The idea of this change is to make -t output useful for users wanting to package all the object files involved in linking for a bug report. Something like the following should do the trick. gcc hello.c -save-temps -Wl,-t | xargs realpath | sort | uniq > files tar cJf test.tar.xz `cat files` * ldlang.c (load_symbols): When -t, print file names for script files and archives. * ldmain.c (trace_files): Make an int. (add_archive_element): Print archive elements only with multiple -t options, or when archive is thin. * ldmain.h (trace_files): Update. * ldmisc.c (vfinfo): Don't print both original path and path in sysroot. * lexsup.c (parse_args ): Increment trace_files. --- ld/ChangeLog | 12 ++++++++++++ ld/ldlang.c | 5 +++-- ld/ldmain.c | 6 ++++-- ld/ldmain.h | 2 +- ld/ldmisc.c | 14 ++++++-------- ld/lexsup.c | 2 +- 6 files changed, 27 insertions(+), 14 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index 03b1b15e21..0453e2e8ee 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,15 @@ +2018-10-29 Alan Modra + + * ldlang.c (load_symbols): When -t, print file names for script + files and archives. + * ldmain.c (trace_files): Make an int. + (add_archive_element): Print archive elements only with multiple + -t options, or when archive is thin. + * ldmain.h (trace_files): Update. + * ldmisc.c (vfinfo): Don't print both original path and path in + sysroot. + * lexsup.c (parse_args ): Increment trace_files. + 2018-10-29 Alan Modra * ldmain.c (main): Print emulation mode and "deleting executable" diff --git a/ld/ldlang.c b/ld/ldlang.c index d2b297ce8b..e525396668 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -2935,6 +2935,9 @@ load_symbols (lang_input_statement_type *entry, if (entry->flags.missing_file) return TRUE; + if (trace_files || verbose) + info_msg ("%pI\n", entry); + if (!bfd_check_format (entry->the_bfd, bfd_archive) && !bfd_check_format_matches (entry->the_bfd, bfd_object, &matching)) { @@ -3010,8 +3013,6 @@ load_symbols (lang_input_statement_type *entry, case bfd_object: if (!entry->flags.reload) ldlang_add_file (entry); - if (trace_files || verbose) - info_msg ("%pI\n", entry); break; case bfd_archive: diff --git a/ld/ldmain.c b/ld/ldmain.c index 36a6c6033e..47cbed1d3d 100644 --- a/ld/ldmain.c +++ b/ld/ldmain.c @@ -77,7 +77,7 @@ int ld_canon_sysroot_len; int g_switch_value = 8; /* Nonzero means print names of input files as processed. */ -bfd_boolean trace_files; +unsigned int trace_files; /* Nonzero means report actions taken by the linker, and describe the linker script in use. */ bfd_boolean verbose; @@ -926,7 +926,9 @@ add_archive_element (struct bfd_link_info *info, minfo ("(%s)\n", name); } - if (trace_files || verbose) + if (verbose + || trace_files > 1 + || (trace_files && bfd_is_thin_archive (orig_input.the_bfd->my_archive))) info_msg ("%pI\n", &orig_input); return TRUE; } diff --git a/ld/ldmain.h b/ld/ldmain.h index 34bde0373d..cd23622466 100644 --- a/ld/ldmain.h +++ b/ld/ldmain.h @@ -29,7 +29,7 @@ extern FILE *saved_script_handle; extern FILE *previous_script_handle; extern bfd_boolean force_make_executable; extern char *default_target; -extern bfd_boolean trace_files; +extern unsigned int trace_files; extern bfd_boolean verbose; extern bfd_boolean version_printed; extern bfd_boolean demangling; diff --git a/ld/ldmisc.c b/ld/ldmisc.c index 3e2a190f9a..fd6a38810b 100644 --- a/ld/ldmisc.c +++ b/ld/ldmisc.c @@ -476,15 +476,13 @@ vfinfo (FILE *fp, const char *fmt, va_list ap, bfd_boolean is_warning) fmt++; i = (lang_input_statement_type *) args[arg_no].p; ++arg_count; - if (i->the_bfd->my_archive != NULL + if (i->the_bfd != NULL + && i->the_bfd->my_archive != NULL && !bfd_is_thin_archive (i->the_bfd->my_archive)) - fprintf (fp, "(%s)", - bfd_get_filename (i->the_bfd->my_archive)); - fprintf (fp, "%s", i->local_sym_name); - if ((i->the_bfd->my_archive == NULL - || bfd_is_thin_archive (i->the_bfd->my_archive)) - && filename_cmp (i->local_sym_name, i->filename) != 0) - fprintf (fp, " (%s)", i->filename); + fprintf (fp, "(%s)%s", i->the_bfd->my_archive->filename, + i->local_sym_name); + else + fprintf (fp, "%s", i->filename); } else if (*fmt == 'R') { diff --git a/ld/lexsup.c b/ld/lexsup.c index 86a033a383..1da6a50bcb 100644 --- a/ld/lexsup.c +++ b/ld/lexsup.c @@ -1233,7 +1233,7 @@ parse_args (unsigned argc, char **argv) command_line.symbolic = symbolic_functions; break; case 't': - trace_files = TRUE; + ++trace_files; break; case 'T': previous_script_handle = saved_script_handle;