annotate bin/unpack.pl @ 5:bca2a490a6f4

updated
author Henry S. Thompson <ht@inf.ed.ac.uk>
date Wed, 16 Sep 2026 19:50:53 +0100
parents 2aa53823fb21
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
1 #!/usr/bin/perl -W
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
2
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
3 use strict;
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
4 use bytes;
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
5 use File::Path;
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
6
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
7 die "did not specify boot img file\n" unless $ARGV[0];
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
8
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
9 my $bootimgfile = $ARGV[0];
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
10
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
11 my $slurpvar = $/;
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
12 undef $/;
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
13 open (BOOTIMGFILE, "$bootimgfile") or die "could not open boot img file: $bootimgfile\n";
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
14 my $bootimg = <BOOTIMGFILE>;
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
15 close BOOTIMGFILE;
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
16 $/ = $slurpvar;
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
17
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
18 # chop off the header
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
19 $bootimg = substr($bootimg,2048);
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
20
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
21 # we'll check how many ramdisks are embedded in this image
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
22 my $numfiles = 0;
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
23
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
24 # we look for the hex 00 00 00 00 1F 8B because we expect some trailing padding zeroes from the kernel or previous ramdisk, followed by 1F 8B (the gzip magic number)
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
25 while ($bootimg =~ m/\x00\x00\x00\x00\x1F\x8B/g) {
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
26 $numfiles++;
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
27 }
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
28
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
29 if ($numfiles == 0) {
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
30 die "Could not find any embedded ramdisk images. Are you sure this is a full boot image?\n";
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
31 } elsif ($numfiles > 1) {
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
32 die "Found a secondary file after the ramdisk image. According to the spec (mkbootimg.h) this file can exist, but this script is not designed to deal with this scenario.\n";
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
33 }
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
34
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
35 $bootimg =~ /(.*\x00\x00\x00\x00)(\x1F\x8B.*)/s;
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
36
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
37 my $kernel = $1;
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
38 my $ramdisk = $2;
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
39
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
40
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
41 open (KERNELFILE, ">$ARGV[0]-kernel.gz");
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
42 print KERNELFILE $kernel or die;
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
43 close KERNELFILE;
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
44
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
45 open (RAMDISKFILE, ">$ARGV[0]-ramdisk.cpio.gz");
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
46 print RAMDISKFILE $ramdisk or die;
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
47 close RAMDISKFILE;
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
48
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
49 print "\nkernel written to $ARGV[0]-kernel.gz\nramdisk written to $ARGV[0]-ramdisk.cpio.gz\n";
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
50 if (-e "$ARGV[0]-ramdisk") {
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
51 rmtree "$ARGV[0]-ramdisk";
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
52 print "\nremoved old directory $ARGV[0]-ramdisk\n";
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
53 }
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
54
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
55 mkdir "$ARGV[0]-ramdisk" or die;
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
56 chdir "$ARGV[0]-ramdisk" or die;
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
57 system ("gunzip -c ../$ARGV[0]-ramdisk.cpio.gz | cpio -i");
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
58
2aa53823fb21 new repo
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
diff changeset
59 print "\nextracted ramdisk contents to directory $ARGV[0]-ramdisk/\n";