依存ライブラリを自動検出してinitramfsを生成するスクリプト
initramfsを作成するとき、すべてのバイナリをstaticビルドするのは面倒です。そこで、依存する共有ライブラリを検出し、ついでにcpioアーカイブまでやってくれるスクリプトを書きました。
使い方
initramfsに含めたい実行ファイルを引数に指定します。実行ファイルと必要な共有ライブラリを initramfs ディレクトリ以下にコピーし、cpioにアーカイブします。出来上がった initramfs.gz はそのままブートローダで使用できます。
引数には実行ファイル以外も指定できます。引数がない場合は単にcpioアーカイブを生成します。
$ ./createinitramfs /bin/busybox $ mkdir initramfs/{proc,dev,sys} $ vim initramfs/init $ ./createinitramfs
例えば上記を実行すると、busyboxに依存する共有ライブラリが initramfs/ 以下にコピーされ、initramfs.gz が生成されます。
ソースコード
#!/usr/bin/perl use File::Basename; my %libs; open(deps, "ldd @ARGV |"); while(<deps>) { if(/ => (.+) \(/) { $libs{$1} = 1; } elsif(/ => \(/) { } elsif(/^\t(.+) \(/) { $libs{$1} = 1; } } for my $self (@ARGV) { $libs{$self} = 1; } $target="./initramfs"; for my $lib (keys %libs) { print "\e[1;32m *\e[0m " . $lib . "\n"; $basedir = $target . dirname($lib); system "mkdir -p $basedir"; system "cp -aL $lib $basedir"; } print "\e[1;32m *\e[0m Compressing...\n"; system "cd $target && find . | cpio -v -o -H newc | gzip > ../$target.gz";