#!/usr/bin/perl
use File::Find ();
die "usage $0 file dir1 dir2 ..." if (@ARGV <2);

$TOPDIR=`pwd`;
chomp   $TOPDIR;

sub myfind
{
my $file;
$fname=$_[0];
eval { File::Find::find(sub{if($fname eq $_){$file=$File::Find::name;die "got";}}, @ARGV); };
chdir $TOPDIR;
return $file;
}


sub findinterp
{
my $file=$_[0];
my $d1;
my $f;
open $f,qq(readelf -l $file |);
while (<$f>)
{
if(/Requesting program interpreter: (\S+)\]/)
{
 $d1="./$1";
}
}
close $f;
return $d1;
}


sub findldd
{
my $file=$_[0];
my @depends;
my $f;
open $f,qq(readelf -d $file |);
while (<$f>)
{
if(/Shared library: \[(\S+)\]/)
{
 my $d1;
 if(!exists $g{$1})
 {
 $g{$1} = 1;

 $d1=myfind($1);
  
 die "can not find $1\n" unless($d1);

 push @depends,$d1,findldd($d1);
 }
}
}
close $f;
return @depends;
}


for $name (findinterp($ARGV[0]),findldd($ARGV[0]))
{

$h{$name}=1;

if( -l $name)
{
($base=$name)=~s#[^/]*$##;
$h{ $base . readlink($name) }=1;
}
}

print qq(tar uf /tmp/1.tar $ARGV[0] \n);
for (keys %h)
{
print qq(tar uf /tmp/1.tar $_ \n);
}

open F,qq(>/tmp/runme);
print F <<"AAA"
D=\$(dirname \$0)
\$D/lib/ld-linux.so.2 --library-path \$D/lib:\$D/usr/lib  $ARGV[0] \$@
AAA
;

close F;

chmod 0777, qq(/tmp/runme);

print qq(tar uf /tmp/1.tar /tmp/runme \n);
