1#!/usr/bin/perl
2#
3# Calculate the amount of space needed to run the kernel, including room for
4# the .bss and .brk sections.
5#
6# Usage:
7# objdump -h a.out | perl calc_run_size.pl
8use strict;
9
10my $mem_size = 0;
11my $file_offset = 0;
12
13my $sections=" *[0-9]+ \.(?:bss|brk) +";
14while (<>) {
15	if (/^$sections([0-9a-f]+) +(?:[0-9a-f]+ +){2}([0-9a-f]+)/) {
16		my $size = hex($1);
17		my $offset = hex($2);
18		$mem_size += $size;
19		if ($file_offset == 0) {
20			$file_offset = $offset;
21		} elsif ($file_offset != $offset) {
22			# BFD linker shows the same file offset in ELF.
23			# Gold linker shows them as consecutive.
24			next if ($file_offset + $mem_size == $offset + $size);
25
26			printf STDERR "file_offset: 0x%lx\n", $file_offset;
27			printf STDERR "mem_size: 0x%lx\n", $mem_size;
28			printf STDERR "offset: 0x%lx\n", $offset;
29			printf STDERR "size: 0x%lx\n", $size;
30
31			die ".bss and .brk are non-contiguous\n";
32		}
33	}
34}
35
36if ($file_offset == 0) {
37	die "Never found .bss or .brk file offset\n";
38}
39printf("%d\n", $mem_size + $file_offset);
40