diff options
author | Alan Modra <amodra@gmail.com> | 2022-08-04 10:12:51 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2022-08-04 12:00:36 +0930 |
commit | 6b9bd54c24dcf08e400e5b79a958e051ccfde30d (patch) | |
tree | 04496fb28858235f67ed838814466f863b6babf4 /ld/ldmisc.c | |
parent | 94e27e8e69a07d69554ee7598419646d3ee99907 (diff) | |
download | gdb-6b9bd54c24dcf08e400e5b79a958e051ccfde30d.zip gdb-6b9bd54c24dcf08e400e5b79a958e051ccfde30d.tar.gz gdb-6b9bd54c24dcf08e400e5b79a958e051ccfde30d.tar.bz2 |
Re: Get rid of fprintf_vma and sprintf_vma
Commit f493c2174e messed the formatting in linker map files,
particularly for 32-bit builds where a number of tests using map files
regressed. I should have noticed the BFD64 conditional printing of
spaces to line up output due to the original %V printing hex vmas with
16 digits when BFD64 and 8 digits when not. Besides that, it is nicer
to print 32-bit vmas for 32-bit targets. So change %V back to be
target dependent, now using bfd_sprintf_vma. Since minfo doesn't
return the number of chars printed, that means some places that
currently use %V must instead sprintf to a buffer in order to find the
length printed.
* ldmisc.h (print_spaces): Declare.
(print_space): Change to a macro.
* ldmisc.c (vfinfo): Use bfd_sprintf_vma for %V. Tidy %W case.
(print_space): Delete.
(print_spaces): New function.
* emultempl/aix.em (print_symbol): Use print_spaces.
* ldctor.c (ldctor_build_sets): Likewise.
* ldmain.c (add_archive_element): Likewise.
* ldlang.c (print_one_symbol, lang_print_asneeded): Likewise.
(print_output_section_statement, print_data_statement): Likewise.
(print_reloc_statement, print_padding_statement): Likewise.
(print_assignment): Likewise. Also replace %V printing of vmas
with printing to a buffer in order to properly format output.
(print_input_section, lang_one_common): Likewise.
Diffstat (limited to 'ld/ldmisc.c')
-rw-r--r-- | ld/ldmisc.c | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/ld/ldmisc.c b/ld/ldmisc.c index ee52487..3a02f75 100644 --- a/ld/ldmisc.c +++ b/ld/ldmisc.c @@ -47,7 +47,7 @@ %H like %C but in addition emit section+offset %P print program name %V hex bfd_vma - %W hex bfd_vma with 0x with no leading zeros taking up 8 spaces + %W hex bfd_vma with 0x with no leading zeros taking up 10 spaces %X no object output, fail return %d integer, like printf %ld long, like printf @@ -241,9 +241,13 @@ vfinfo (FILE *fp, const char *fmt, va_list ap, bool is_warning) case 'V': /* hex bfd_vma */ { - uint64_t value = args[arg_no].v; + char buf[32]; + bfd_vma value; + + value = args[arg_no].v; ++arg_count; - fprintf (fp, "%016" PRIx64, value); + bfd_sprintf_vma (link_info.output_bfd, buf, value); + fprintf (fp, "%s", buf); } break; @@ -258,22 +262,15 @@ vfinfo (FILE *fp, const char *fmt, va_list ap, bool is_warning) case 'W': /* hex bfd_vma with 0x with no leading zeroes taking up - 8 spaces. */ + 10 spaces (including the 0x). */ { - char buf[100]; + char buf[32]; uint64_t value; - int len; value = args[arg_no].v; ++arg_count; - sprintf (buf, "%" PRIx64, value); - len = strlen (buf); - while (len < 8) - { - putc (' ', fp); - ++len; - } - fprintf (fp, "0x%s", buf); + sprintf (buf, "0x%" PRIx64, value); + fprintf (fp, "%10s", buf); } break; @@ -653,9 +650,9 @@ lfinfo (FILE *file, const char *fmt, ...) /* Functions to print the link map. */ void -print_space (void) +print_spaces (int count) { - fprintf (config.map_file, " "); + fprintf (config.map_file, "%*s", count, ""); } void |