#!/usr/bin/perl # Find all libraries for the executables # use warnings; use strict; use Data::Dumper; use File::Copy; use File::Basename; my $dest = shift or die "Usage: $0 dest-dir [programs...]\n"; my %libraries; my %deps; for my $file (@ARGV) { my @libs = `ldd "$file"`; for (@libs) { if (/ not found/) { # check to see if it is already installed my ($lib) = /^\s*(.*?)\s*=>/; warn "$file: '$lib' $_" unless -r "$dest/$lib"; next; } if (/ => ([^ ]+)/) { # Normal library $libraries{$1}++; push @{$deps{$file}}, $1; } elsif (/^\s+([^ ]+) \(/) { # Dynamic linker $libraries{$1}++; } } } #print Dumper(\%libraries); print "$_: ", join(" ", @{$deps{$_}}), "\n" for keys %deps; print "\n"; unless( -d $dest ) { system("mkdir", "-p", $dest) and die "$dest: Unable to make directory: $!\n"; } my $size = 0; for my $lib (keys %libraries) { # skip vdso next if $lib =~ /vdso/; warn "$lib\n"; $size += -s $lib; my $libname = basename $lib; # my $dirname = dirname "$dest/$lib"; # # unless( -d $dirname ) # { # system("mkdir", "-p", $dirname) # and die "$dirname: Unable to make directory: $!\n"; # } my $dest_lib = "$dest/$libname"; copy $lib, $dest_lib or die "$lib: Unable to copy: $!\n"; # make them executable because otherwise chroot barfs system("chmod", "+x", $dest_lib); } print "Total size $size\n"; __END__