[Patch, tentative] Show output section size contribution from each input file in map file
Senthil Kumar Selvaraj
senthil_kumar.selvaraj@atmel.com
Mon Jun 8 06:00:00 GMT 2015
Ping!
Regards
Senthil
On Wed, May 27, 2015 at 08:58:22AM +0530, Senthil Kumar Selvaraj wrote:
> On Wed, May 27, 2015 at 10:42:22AM +0930, Alan Modra wrote:
> > On Wed, May 20, 2015 at 06:14:46PM +0530, Senthil Kumar Selvaraj wrote:
> > > 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.
> >
> > Sorry, I don't see this as useful at all. For people who don't want
> > the collected information, it is just clutter. Teach your users about
> > grep instead..
>
> For trivial, straightforward compile-linkss, I agree it doesn't add value.
>
> Where it gets interesting is when code is compiled and linked with
> -ffunction-sections/-fdata-sections or with custom section names, which
> are then grouped into appropriate output sections in the (perhaps custom)
> linker script.
>
> For example, for this source file
>
> $ cat test.c
>
> volatile int x;
> int y;
> void foo()
> {
> y++;
> }
>
>
> void bar()
> {
> x++;
> }
>
> int main()
> {
> bar();
> return x;
> }
>
> When compiled with
> $ ~/avr/install/bin/avr-gcc -o test.o -c test.c -ffunction-sections -fdata-sections -mmcu=atmega1280
> $ ~/avr/install/bin/avr-gcc -o test test.o -Wl,--gc-sections -Wl,-Map=test.map -mmcu=atmega1280
>
> Running grep 'test.o' test.map
>
> .text 0x0000000000000000 0x0 test.o
> .data 0x0000000000000000 0x0 test.o
> .bss 0x0000000000000000 0x0 test.o
> .text.foo 0x0000000000000000 0x22 test.o
> LOAD test.o
> .text.bar 0x000000000000010c 0x22 test.o
> .text.main 0x000000000000012e 0x1a test.o
> COMMON 0x0000000000800200 0x4 test.o
> .comment 0x0000000000000000 0x29 test.o
>
> whereas the map file (after my patch), has this
>
> Input files and contributions to output file.
>
> /home/saaadhu/avr/install/lib/gcc/avr/6.0.0/../../../../avr/lib/avr51/crtatmega1280.o
>
> .text 0xfc
> .note.gnu.avr.deviceinfo
> 0x40
> .debug_info 0xbbc
> .debug_abbrev 0xb1a
> .debug_line 0x1d
> .debug_str 0x3e9
>
> test.o
>
> .text 0x3c
> .bss 0x4
> .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
> test.o
>
> To arrive at that, you'd have to skip the initial few lines (from the discarded sections output), figure out
> the input->output section mapping for .text.{bar,main} and then add up the sizes.
>
> You'd also have to repeat this for *every* object file involved in the link, remembering to include crt/startup,
> archive members etc..
>
> I'm not saying it can't be done otherwise - just that the linker already has all this information that might
> prove useful for code size analysis, so why not make it show that? Would making it optional via a command line flag work?
>
> Regards
> Senthil
>
> >
> > $ gcc -o hello hello.o -Wl,-Map,hello.map
> > $ grep hello.o hello.map
> > 0x0000000000000000 0x0 hello.o
> > LOAD hello.o
> > .text 0x00000000004004d6 0x46 hello.o
> > .rodata 0x00000000004005a4 0x6 hello.o
> > .eh_frame 0x0000000000400658 0x40 hello.o
> > .data 0x0000000000600928 0x0 hello.o
> > .bss 0x0000000000600929 0x0 hello.o
> > .comment 0x000000000000001a 0x1b hello.o
> >
> > --
> > Alan Modra
> > Australia Development Lab, IBM
More information about the Binutils
mailing list