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