読者です 読者をやめる 読者になる 読者になる

GeekFactory

int128.hatenablog.com

依存ライブラリを自動検出してinitramfsを生成するスクリプト

Linux coLinux

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";

必要なもの

perl, ldd, cpio, gzip