1e6023367d779060fddc9a52d1f474085b2b36298Junjie Mao#!/usr/bin/perl 2e6023367d779060fddc9a52d1f474085b2b36298Junjie Mao# 3e6023367d779060fddc9a52d1f474085b2b36298Junjie Mao# Calculate the amount of space needed to run the kernel, including room for 4e6023367d779060fddc9a52d1f474085b2b36298Junjie Mao# the .bss and .brk sections. 5e6023367d779060fddc9a52d1f474085b2b36298Junjie Mao# 6e6023367d779060fddc9a52d1f474085b2b36298Junjie Mao# Usage: 7e6023367d779060fddc9a52d1f474085b2b36298Junjie Mao# objdump -h a.out | perl calc_run_size.pl 8e6023367d779060fddc9a52d1f474085b2b36298Junjie Maouse strict; 9e6023367d779060fddc9a52d1f474085b2b36298Junjie Mao 10e6023367d779060fddc9a52d1f474085b2b36298Junjie Maomy $mem_size = 0; 11e6023367d779060fddc9a52d1f474085b2b36298Junjie Maomy $file_offset = 0; 12e6023367d779060fddc9a52d1f474085b2b36298Junjie Mao 13e6023367d779060fddc9a52d1f474085b2b36298Junjie Maomy $sections=" *[0-9]+ \.(?:bss|brk) +"; 14e6023367d779060fddc9a52d1f474085b2b36298Junjie Maowhile (<>) { 15e6023367d779060fddc9a52d1f474085b2b36298Junjie Mao if (/^$sections([0-9a-f]+) +(?:[0-9a-f]+ +){2}([0-9a-f]+)/) { 16e6023367d779060fddc9a52d1f474085b2b36298Junjie Mao my $size = hex($1); 17e6023367d779060fddc9a52d1f474085b2b36298Junjie Mao my $offset = hex($2); 18e6023367d779060fddc9a52d1f474085b2b36298Junjie Mao $mem_size += $size; 19e6023367d779060fddc9a52d1f474085b2b36298Junjie Mao if ($file_offset == 0) { 20e6023367d779060fddc9a52d1f474085b2b36298Junjie Mao $file_offset = $offset; 21e6023367d779060fddc9a52d1f474085b2b36298Junjie Mao } elsif ($file_offset != $offset) { 2270b61e362187b5fccac206506d402f3424e3e749Kees Cook # BFD linker shows the same file offset in ELF. 2370b61e362187b5fccac206506d402f3424e3e749Kees Cook # Gold linker shows them as consecutive. 2470b61e362187b5fccac206506d402f3424e3e749Kees Cook next if ($file_offset + $mem_size == $offset + $size); 2570b61e362187b5fccac206506d402f3424e3e749Kees Cook 2670b61e362187b5fccac206506d402f3424e3e749Kees Cook printf STDERR "file_offset: 0x%lx\n", $file_offset; 2770b61e362187b5fccac206506d402f3424e3e749Kees Cook printf STDERR "mem_size: 0x%lx\n", $mem_size; 2870b61e362187b5fccac206506d402f3424e3e749Kees Cook printf STDERR "offset: 0x%lx\n", $offset; 2970b61e362187b5fccac206506d402f3424e3e749Kees Cook printf STDERR "size: 0x%lx\n", $size; 3070b61e362187b5fccac206506d402f3424e3e749Kees Cook 3170b61e362187b5fccac206506d402f3424e3e749Kees Cook die ".bss and .brk are non-contiguous\n"; 32e6023367d779060fddc9a52d1f474085b2b36298Junjie Mao } 33e6023367d779060fddc9a52d1f474085b2b36298Junjie Mao } 34e6023367d779060fddc9a52d1f474085b2b36298Junjie Mao} 35e6023367d779060fddc9a52d1f474085b2b36298Junjie Mao 36e6023367d779060fddc9a52d1f474085b2b36298Junjie Maoif ($file_offset == 0) { 37e6023367d779060fddc9a52d1f474085b2b36298Junjie Mao die "Never found .bss or .brk file offset\n"; 38e6023367d779060fddc9a52d1f474085b2b36298Junjie Mao} 39e6023367d779060fddc9a52d1f474085b2b36298Junjie Maoprintf("%d\n", $mem_size + $file_offset); 40