This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Patch, tentative] Show output section size contribution from each input file in map file


Hi,

This very rough patch adds extra information to the map file to show 
how much each input file contributed to output sections in the output
file. While this information can already by computed by 
grepping/summing existing map file output, this patch makes that 
unnecessary - it groups by input bfd.

The primary motivation is to help embedded developers (or anyone who is
paranoid about code size) quickly figure out where most of the code/data 
is coming from.

This is how the output looks (for an AVR ELF).

<snip>

Input files and contributions to output file.

/home/saaadhu/avr/install/lib/gcc/avr/6.0.0/../../../../avr/lib/avr51/crtatmega1280.o

.text                 0xf6
.note.gnu.avr.deviceinfo
                      0x40
.debug_info          0xbbc
.debug_abbrev        0xb1a
.debug_line           0x1d
.debug_str           0x3e9

/tmp/cclzAVJF.o

.text                 0x12
.comment              0x29

_exit.o

.text                  0x4
.debug_aranges        0x20
.debug_info           0x93
.debug_abbrev         0x14
.debug_line           0x70

_clear_bss.o

.text                 0x10
.debug_aranges        0x20
.debug_info           0x93
.debug_abbrev         0x14
.debug_line           0x94

What do you guys think? Is there a better way to do this?

Regards
Senthil


diff --git a/ld/ldlang.c b/ld/ldlang.c
index c96c21f..bf97f57 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -2052,6 +2052,15 @@ lang_map_flags (flagword flag)
     minfo ("l");
 }
 
+
+static bfd_boolean
+is_section_discarded (asection *s)
+{
+  return ((s->output_section == NULL
+              || s->output_section->owner != link_info.output_bfd)
+	      && (s->flags & (SEC_LINKER_CREATED | SEC_KEEP)) == 0);
+}
+
 void
 lang_map (void)
 {
@@ -2067,9 +2076,7 @@ lang_map (void)
 	continue;
 
       for (s = file->the_bfd->sections; s != NULL; s = s->next)
-	if ((s->output_section == NULL
-	     || s->output_section->owner != link_info.output_bfd)
-	    && (s->flags & (SEC_LINKER_CREATED | SEC_KEEP)) == 0)
+	if (is_section_discarded (s))
 	  {
 	    if (! dis_header_printed)
 	      {
@@ -2133,6 +2140,66 @@ lang_map (void)
   lang_statement_iteration++;
   print_statements ();
 
+  fprintf (config.map_file, _("\nInput files and contributions to "
+              "output file."));
+
+  LANG_FOR_EACH_INPUT_STATEMENT (f)
+    {
+      if ((f->the_bfd->flags & (BFD_LINKER_CREATED | DYNAMIC)) != 0
+	  || f->flags.just_syms || f->the_bfd->filename == NULL)
+	    continue;
+
+      bfd_boolean does_bfd_contribute = FALSE;
+
+      lang_output_section_statement_type *os;
+      for (os = &lang_output_section_statement.head->output_section_statement;
+           os != NULL;
+           os = os->next)
+        {
+          asection *output_section = os->bfd_section;
+          if (output_section == NULL)
+            continue;
+
+          asection *i;
+          bfd_size_type size_from_this_bfd = 0;
+
+          for (i = f->the_bfd->sections; i != NULL; i = i->next)
+            {
+              if (is_section_discarded (i))
+                continue;
+
+              if (i->output_section == output_section)
+                size_from_this_bfd += i->size;
+            }
+
+            if (size_from_this_bfd > 0)
+              {
+                int len;
+
+                if (does_bfd_contribute == FALSE)
+                {
+                  does_bfd_contribute = TRUE;
+                  fprintf (config.map_file, "\n\n%s\n", f->the_bfd->filename);
+                }
+
+                minfo ("\n%s", output_section->name);
+
+                len = strlen (output_section->name);
+                if (len >= SECTION_NAME_MAP_LENGTH - 1)
+                {
+                    print_nl ();
+                    len = 0;
+                }
+                while (len < SECTION_NAME_MAP_LENGTH)
+                {
+                    print_space ();
+                    ++len;
+                }
+                minfo ("%W", size_from_this_bfd);
+              }
+          }
+     }
+
   ldemul_extra_map_file_text (link_info.output_bfd, &link_info, config.map_file);
 }
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]