aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2018-10-29 18:10:06 +1030
committerAlan Modra <amodra@gmail.com>2018-10-29 18:21:05 +1030
commit727a29badd95a68d08b86fec0b98702ce756c660 (patch)
tree83df8737f89d9e8cee74c6d1e98db4475a7555fb
parent5c87f94bb85e5b8e715aa7f947ecc602960f20ee (diff)
downloadgdb-727a29badd95a68d08b86fec0b98702ce756c660.zip
gdb-727a29badd95a68d08b86fec0b98702ce756c660.tar.gz
gdb-727a29badd95a68d08b86fec0b98702ce756c660.tar.bz2
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 <t>): Increment trace_files.
-rw-r--r--ld/ChangeLog12
-rw-r--r--ld/ldlang.c5
-rw-r--r--ld/ldmain.c6
-rw-r--r--ld/ldmain.h2
-rw-r--r--ld/ldmisc.c14
-rw-r--r--ld/lexsup.c2
6 files changed, 27 insertions, 14 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 03b1b15..0453e2e 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,5 +1,17 @@
2018-10-29 Alan Modra <amodra@gmail.com>
+ * 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 <t>): Increment trace_files.
+
+2018-10-29 Alan Modra <amodra@gmail.com>
+
* ldmain.c (main): Print emulation mode and "deleting executable"
for --verbose, not --trace.
(add_archive_element): Only print "no new IR symbols" for --verbose.
diff --git a/ld/ldlang.c b/ld/ldlang.c
index d2b297c..e525396 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 36a6c60..47cbed1 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 34bde03..cd23622 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 3e2a190..fd6a388 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 86a033a..1da6a50 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;