objdump: Better objdump section headers in wide mode

When displaying the section headers table using objdump (-h), the column
containing the section header name is currently fixed at 13 characters.
A section name that is longer than 13 characters will overflow the
column causing the table to become miss-aligned.

In this commit I change the behaviour so that _in wide mode_ (-w -h) the
section name column is dynamically resized to fit the longest section
name we plan to display.  In wide mode the column still retains a
minimum width of 13 characters.

In non-wide more the behaviour is completely unchanged.

While I was changing the dump_headers function I have unified the two
printf lines that handled the different address widths into a single
printf, the address width is now passed into printf using the '*' field
width format character.

binutils/ChangeLog:

	* objdump.c (dump_section_header): Extract max section name length
	from data parameter, use this when formatting output.
	(find_longest_section_name): New function.
	(dump_headers): Calculate longest section name when in wide mode,
	reformat to unify printing of header line.

ld/ChangeLog:

	* testsuite/ld-elf/eh-frame-hdr.d: Update expected results.
This commit is contained in:
Andrew Burgess 2016-12-28 13:22:44 +00:00
parent 2132fe8503
commit 1737c64030
4 changed files with 59 additions and 9 deletions

View File

@ -1,3 +1,11 @@
2017-01-20 Andrew Burgess <andrew.burgess@embecosm.com>
* objdump.c (dump_section_header): Extract max section name length
from data parameter, use this when formatting output.
(find_longest_section_name): New function.
(dump_headers): Calculate longest section name when in wide mode,
reformat to unify printing of header line.
2017-01-18 Bernhard Rosenkranzer <bero@lindev.ch>
PR 21059

View File

@ -438,11 +438,11 @@ free_only_list (void)
static void
dump_section_header (bfd *abfd, asection *section,
void *ignored ATTRIBUTE_UNUSED)
dump_section_header (bfd *abfd, asection *section, void *data)
{
char *comma = "";
unsigned int opb = bfd_octets_per_byte (abfd);
int longest_section_name = *((int *) data);
/* Ignore linker created section. See elfNN_ia64_object_p in
bfd/elfxx-ia64.c. */
@ -453,7 +453,7 @@ dump_section_header (bfd *abfd, asection *section,
if (! process_section_p (section))
return;
printf ("%3d %-13s %08lx ", section->index,
printf ("%3d %-*s %08lx ", section->index, longest_section_name,
bfd_get_section_name (abfd, section),
(unsigned long) bfd_section_size (abfd, section) / opb);
bfd_printf_vma (abfd, bfd_get_section_vma (abfd, section));
@ -536,26 +536,64 @@ dump_section_header (bfd *abfd, asection *section,
#undef PF
}
/* Called on each SECTION in ABFD, update the int variable pointed to by
DATA which contains the string length of the longest section name. */
static void
find_longest_section_name (bfd *abfd, asection *section, void *data)
{
int *longest_so_far = (int *) data;
const char *name;
int len;
/* Ignore linker created section. */
if (section->flags & SEC_LINKER_CREATED)
return;
/* Skip sections that we are ignoring. */
if (! process_section_p (section))
return;
name = bfd_get_section_name (abfd, section);
len = (int) strlen (name);
if (len > *longest_so_far)
*longest_so_far = len;
}
static void
dump_headers (bfd *abfd)
{
printf (_("Sections:\n"));
/* The default width of 13 is just an arbitrary choice. */
int max_section_name_length = 13;
int bfd_vma_width;
#ifndef BFD64
printf (_("Idx Name Size VMA LMA File off Algn"));
bfd_vma_width = 10;
#else
/* With BFD64, non-ELF returns -1 and wants always 64 bit addresses. */
if (bfd_get_arch_size (abfd) == 32)
printf (_("Idx Name Size VMA LMA File off Algn"));
bfd_vma_width = 10;
else
printf (_("Idx Name Size VMA LMA File off Algn"));
bfd_vma_width = 18;
#endif
printf (_("Sections:\n"));
if (wide_output)
bfd_map_over_sections (abfd, find_longest_section_name,
&max_section_name_length);
printf (_("Idx %-*s Size %-*s%-*sFile off Algn"),
max_section_name_length, "Name",
bfd_vma_width, "VMA",
bfd_vma_width, "LMA");
if (wide_output)
printf (_(" Flags"));
printf ("\n");
bfd_map_over_sections (abfd, dump_section_header, NULL);
bfd_map_over_sections (abfd, dump_section_header,
&max_section_name_length);
}
static asymbol **

View File

@ -1,3 +1,7 @@
2017-01-20 Andrew Burgess <andrew.burgess@embecosm.com>
* testsuite/ld-elf/eh-frame-hdr.d: Update expected results.
2017-01-18 Maciej W. Rozycki <macro@imgtec.com>
PR ld/20995

View File

@ -5,5 +5,5 @@
#xfail: avr*-*-* or1k*-*-elf or1k*-*-rtems* pru-*-* visium-*-*
# These targets support CFI generation but not shared libraries.
#...
[0-9] .eh_frame_hdr 0*[12][048c] .*
[0-9] .eh_frame_hdr +0*[12][048c] .*
#pass