rockbox/tools/ovl_offset.pl
Michael Sevakis 1329cc29de Fix .ncbss from possibly overlapping .ncdata in plugins/codecs.
(Take #2)

If .bss wasn't large enough, and .ncdata was empty, .ncbss would be
at an address overlapping the alignment-padded end of .ncdata and
and linking would fail with an overlap error.

Adds plugin load end address that accounts for IRAM going past
the final .bss sections, making IRAM overlay compatible. load_code
could also use this instead of the file size.

The .lds becomes a bit more straightforward and explicit when
assigning addresses.

Change-Id: Id0c33f257710e97ece2c831e0feaaa32c1a14e05
2013-07-11 04:32:23 -04:00

35 lines
1.1 KiB
Perl
Executable file

#!/usr/bin/perl
# Calculate the highest possible location for an overlay based
# on a reference map file (.refmap)
sub map_scan {
# The buflib handle table is a few hundred bytes, just before
# the plugin buffer. We assume it's never more than 1024 bytes.
# If this assumption is wrong, overlay loading will fail.
my $max_handle_table_size = 1024;
my ($map) = @_;
my $ramstart = -1, $ramsize = -1, $startaddr = -1, $endaddr = -1;
open (MAP, "<$map");
while (<MAP>) {
if ($_ =~ /^PLUGIN_RAM +0x([0-9a-f]+) +0x([0-9a-f]+)$/) {
$ramstart = hex($1);
$ramsize = hex($2);
}
elsif ($_ =~ / +0x([0-9a-f]+) +_?plugin_start_addr = ./) {
$startaddr = hex($1);
}
elsif ($_ =~ / +0x([0-9a-f]+) +_?plugin_load_end_addr = ./) {
$endaddr = hex($1);
}
}
close (MAP);
if ($ramstart < 0 || $ramsize < 0 || $startaddr < 0 || $endaddr < 0
|| $ramstart != $startaddr) {
printf "Could not analyze map file.\n";
exit 1;
}
return $ramstart + $ramsize - $endaddr - $max_handle_table_size;
}
printf map_scan($ARGV[0]) & ~0xf;