#!perl -w
use strict;
use warnings;
use File::Slurp;

my $rdb = read_file( "/etc/rebase.db.i386", {binmode => ":raw"} );
my %rdb = (
    RawDB   => [],
    ByIndex => [],
    ByName  => {},
);
@rdb{qw( Magic Machine Version BaseAddr Offset Down NumEntries )} =
    unpack "A4SSQLIL", $rdb;
push $rdb{RawDB}, unpack "x[A4SSQLI]L/(QLQLLL)(Z*)*", $rdb;
foreach my $i (0..$rdb{NumEntries}-1) {
    my $raw     = $rdb{RawDB};
    my $name    = $raw->[$i - $rdb{NumEntries}];
    my %Entry;
    @Entry{qw( Index Name Length BaseAddr Size SlotSize Flags )} = ( $i, $name, @$raw[6*$i+1..6*$i+5] );
    $rdb{ByName}->{$name} = \%Entry;
    $rdb{ByIndex}->[$i]   = \%Entry;
}
printf( "Magic:\t %s\nMachine: 0x%04x\nVersion: 0x%04x\nBase:\t 0x%012x\nOffset:\t 0x%04x\n"
	."Down:\t 0x%04x\nCount:\t %d (%d)\n",
	@rdb{qw( Magic Machine Version BaseAddr Offset Down NumEntries )}, scalar( @{$rdb{RawDB}} ));
foreach my $i (0..$rdb{NumEntries}-1) {
    my $Entry = $rdb{ByIndex}->[$i];
    print( "\n$Entry->{Index}:\t$Entry->{Name} (Length ",
    ($Entry->{Length} == length( $Entry->{Name} ) + 1) ? "" : "not ", "correct).\n" );
    printf( "Mapped from 0x%012x => 0x%012x (Slot 0x%08x, Size 0x%08x)\n",
	    $Entry->{BaseAddr}, $Entry->{BaseAddr} + $Entry->{SlotSize},
	    $Entry->{SlotSize}, $Entry->{Size} );
}