50 lines
1.4 KiB
Perl
Executable File
50 lines
1.4 KiB
Perl
Executable File
#!/usr/local/bin/perl
|
|
|
|
foreach $f (@ARGV) {
|
|
open(FILE, $f) || die("Cannot open $f");
|
|
seek(FILE, -16, 2);
|
|
$num_sections = do read_int();
|
|
read(FILE, $magic, 12);
|
|
seek(FILE, -16 - 8 * $num_sections, 2);
|
|
@secname = ();
|
|
@seclength = ();
|
|
%length = ();
|
|
for ($i = 0; $i < $num_sections; $i++) {
|
|
read(FILE, $sec, 4);
|
|
$secname[$i] = $sec;
|
|
$seclength[$i] = do read_int();
|
|
$length{$sec} = $seclength[$i];
|
|
}
|
|
print $f, ":\n" if ($#ARGV > 0);
|
|
$path =
|
|
$length{'RNTM'} > 0 ?
|
|
do read_section('RNTM') :
|
|
"(default runtime)\n";
|
|
printf ("\tcode: %-7d data: %-7d symbols: %-7d debug: %-7d\n",
|
|
$length{'CODE'}, $length{'DATA'},
|
|
$length{'SYMB'}, $length{'DBUG'});
|
|
printf ("\tmagic number: %s runtime system: %s",
|
|
$magic, $path);
|
|
close(FILE);
|
|
}
|
|
|
|
sub read_int {
|
|
read(FILE, $buff, 4) == 4 || die("Truncated bytecode file $f");
|
|
@int = unpack("C4", $buff);
|
|
return ($int[0] << 24) + ($int[1] << 16) + ($int[2] << 8) + $int[3];
|
|
}
|
|
|
|
sub read_section {
|
|
local ($sec) = @_;
|
|
local ($i, $ofs, $data);
|
|
for ($i = $num_sections - 1; $i >= 0; $i--) {
|
|
$ofs += $seclength[$i];
|
|
if ($secname[$i] eq $sec) {
|
|
seek(FILE, -16 - 8 * $num_sections - $ofs, 2);
|
|
read(FILE, $data, $seclength[$i]);
|
|
return $data;
|
|
}
|
|
}
|
|
return '';
|
|
}
|