mirror of
https://github.com/linuxboot/heads.git
synced 2024-12-30 01:38:56 +00:00
86 lines
1.4 KiB
Perl
Executable File
86 lines
1.4 KiB
Perl
Executable File
#!/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__
|