Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1555965
  • 博文数量: 290
  • 博客积分: 3468
  • 博客等级: 中校
  • 技术积分: 3461
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-28 22:21
文章分类

全部博文(290)

文章存档

2016年(13)

2015年(3)

2014年(42)

2013年(67)

2012年(90)

2011年(75)

分类: 嵌入式

2012-07-06 14:26:22

程序如下:

点击(此处)折叠或打开

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

  4. $TOPDIR=`pwd`;
  5. chomp $TOPDIR;

  6. sub myfind
  7. {
  8. my $file;
  9. $fname=$_[0];
  10. eval { File::Find::find(sub{if($fname eq $_){$file=$File::Find::name;die "got";}}, @ARGV); };
  11. chdir $TOPDIR;
  12. return $file;
  13. }


  14. sub findinterp
  15. {
  16. my $file=$_[0];
  17. my $d1;
  18. my $f;
  19. open $f,qq(readelf -l $file |);
  20. while (<$f>)
  21. {
  22. if(/Requesting program interpreter: (\S+)\]/)
  23. {
  24.  $d1="$1";
  25. }
  26. }
  27. close $f;
  28. return $d1;
  29. }


  30. sub findldd
  31. {
  32. my $file=$_[0];
  33. my @depends;
  34. my $f;
  35. open $f,qq(readelf -d $file |);
  36. while (<$f>)
  37. {
  38. if(/Shared library: \[(\S+)\]/)
  39. {
  40.  my $d1;
  41.  if(!exists $g{$1})
  42.  {
  43.  $g{$1} = 1;

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

  47.  push @depends,$d1,findldd($d1);
  48.  }
  49. }
  50. }
  51. close $f;
  52. return @depends;
  53. }


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

  56. $h{$name}=1;

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

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

  68. print qq(write to /tmp/getlib\n);
  69. print qq(please run "/tmp/getlib"\n);
  70. for (keys %h)
  71. {
  72. open STDOUT,">>/tmp/getlib";
  73. print qq(tar uf /tmp/$ARGV[0].tar $_ \n);
  74. }

  75. chmod 0777 ,qq(/tmp/getlib);

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

  82. close F;

  83. chmod 0777, qq(/tmp/runme);

  84. print qq(tar uf /tmp/$ARGV[0].tar /tmp/runme \n);
由于不同的系统对/lib/ld-2.11.2.so 的软链接,名字稍有不同,
故写入 runme的 /lib/ld-linux.so.2 可根据实际系统修改调整

运行:
perl ./ldd-pack1 二进制文件 寻找依赖库的路径
例如:

点击(此处)折叠或打开

  1. perl ./ldd-pack1 rdesktop /lib /usr/lib

运行完之后,会在 /tmp 目录下生成 getlib 文件,执行 /tmp/getlib 之后,在/tmp 下会得到 rdesktop .tar 文件,里面包括, rdesktop 所有依赖库,rdesktop 及 runme
阅读(5309) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

liutian3333332013-05-24 09:49:13

请问如果在windows下实现这个功能,都需要修改哪里呢?