LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2153|回复: 13

如何将程序要用到的lib文件,复制到另一个文件夹?

[复制链接]
发表于 2011-5-30 08:51:55 | 显示全部楼层 |阅读模式
ldd  程序的路径  回车

就会显示程序要用到的所有文件。在usr/lib里面
但是有很多文件,一个个复制出来眼都看花

有什么命令可以一次复制ldd关联的文件?
发表于 2011-5-30 10:03:58 | 显示全部楼层
命令不知道,不过随便写几行脚本都可以做嘛

  1. #!/bin/bash
  2. NO_ARG=-1

  3. if [ $# -lt 1 ]
  4. then
  5.         echo "Give me a arg."
  6.         exit $NO_ARG
  7. fi

  8. for name in $(ldd ${1} | awk -F' ' '{print $3}')
  9. do
  10.         echo $name  # some operation
  11. done
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-5-30 10:20:55 | 显示全部楼层
Post by henryhj;2141129
命令不知道,不过随便写几行脚本都可以做嘛

  1. #!/bin/bash
  2. NO_ARG=-1

  3. if [ $# -lt 1 ]
  4. then
  5.         echo "Give me a arg."
  6.         exit $NO_ARG
  7. fi

  8. for name in $(ldd ${1} | awk -F' ' '{print $3}')
  9. do
  10.         echo $name  # some operation
  11. done
复制代码

保存成sh文件吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-5-30 10:29:39 | 显示全部楼层
怎样使用。。。
回复 支持 反对

使用道具 举报

发表于 2011-5-30 10:45:40 | 显示全部楼层
for i in $(ldd /bin/ls|awk '{print $3}');do cp $i .;done
/bin/ls换成自己的程序
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-5-30 12:18:53 | 显示全部楼层
运行ldd  /home/proje/mplayer

复制到 /home/proje/aaa
能不能给我完整点的例子。暂时不是很懂sh脚本
回复 支持 反对

使用道具 举报

发表于 2011-5-30 13:50:17 | 显示全部楼层
Post by zzxap;2141145
运行ldd  /home/proje/mplayer

复制到 /home/proje/aaa
能不能给我完整点的例子。暂时不是很懂sh脚本


for i in $(ldd /home/proje/mplayer|awk '{print $3}');do cp $i /home/proje/aaa/;done
回复 支持 反对

使用道具 举报

发表于 2011-5-30 15:27:17 | 显示全部楼层
这是我用来制作 bootcd 用到的脚本,是现实可用的

详细请参照 http://imghch.com/doc/bk02ch02s04.html      2.4.3 节

[php]
cat > $WORK/gld.pl << 'EOF' && chmod +x $WORK/gld.pl
#!/usr/bin/perl
#===============================================================================
#
#  DESCRIPTION:  Get library
#
#       AUTHOR:  DawnFantasy, <goldenshore999 # gmail # com>
#      VERSION:  1.1
#         DATE:  2008-02-04
#
#===============================================================================

use strict;
use warnings;

use Getopt:ong;

my %opts;
$opts{target} = 'tmpfs';
usage(), exit -1
    if ( not GetOptions( \%opts, 'import=s', 'verbose', 'target|t=s' )
);
usage(), exit -1
    if ( ( not @ARGV ) xor ( defined $opts{import} ) );

sub usage {
    print <<EOU;
Usage:
    $0 file1 [file2...fileX]  [-t DIR]  [-v]
    or
    $0 -i list  [-t DIR]  [-v]

Options:
    -i, --import=FILE       Process files listed in FILE
    -t, --target=DIR        Use DIR as root. (Default ./initrd)
    -v, --verbose           Be verbose.
EOU
    return;
}


## files to process
my @files;
{
    my @filess;
    {
        ## files in @ARGV
        if ( not defined $opts{import} ) {
            push @filess, @ARGV;
            last;
        }

        ## import list
        open my $fh, '<', $opts{import}
            or die "$!\n";
        @filess = (<$fh>);
        @filess = map { chomp; $_ } @filess;
        close $fh;
    }
    print "File to process: (! means file NOT found.)\n";
    foreach (@filess) {
        print " !  $_ \n" and next if not -f $_;
        push @files, $_;
        print "    $_\n";
    }
}

## parse libs to copy
my @libs;
{
    print "\n";
    foreach (@files) {
        my $ldd = qx{/usr/bin/ldd $_};
        chomp $ldd;
        print "$ldd\n\n" if defined $opts{verbose};

        my @files = split /\s+/, $ldd;
        push @libs, grep { -f $_ } @files;    ## check for existence
    }

    ## Unified them
    my %h = map { ( $_, 1 ) } @libs;
    @libs = sort keys %h;
    if ( defined $opts{verbose} ) {
        print "Libraries to copy:\n";
        print "    $_  => $opts{target}$_\n" foreach @libs;
    }
}

## Do the real work
print "\n";
{
    print "Copying files, please wait...\n";

    ## Add those files in the original list
    push @libs, @files;

    if ( not -d $opts{target} ) {
        print "Creating directory $opts{target}\n";
        system qq{ mkdir -p $opts{target} };
    }

    my $v = $opts{verbose} ? 'v' : '';
    foreach (@libs) {
        if (/^\//) {
            ## Absolute path
            s/^\///;
            system
                qq{ tar -C / -hpmcf - $_ | tar -C $opts{target} -pmx$v -f - };
        } else {
            ## Opposite path
            system
                qq{ tar      -hpmcf - $_ | tar -C $opts{target} -pmx$v -f - };
        }
    }
}



EOF
[/php]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-5-30 17:17:23 | 显示全部楼层
Post by ly50247;2141153
for i in $(ldd /home/proje/mplayer|awk '{print $3}');do cp $i /home/proje/aaa/;done


简单强大,但是运行完提示cp: 无法 stat “(0x00c8e000)”: 没有那个文件或目录
回复 支持 反对

使用道具 举报

发表于 2011-5-31 00:58:09 | 显示全部楼层
Post by zzxap;2141169
简单强大,但是运行完提示cp: 无法 stat “(0x00c8e000)”: 没有那个文件或目录
问题在这里(以man命令为例):
  1. fmying@EagleNest:~$ ldd /usr/bin/man
  2.         linux-vdso.so.1 =>  (0x00007fff322cd000)
  3.         libgdbm.so.3 => /usr/lib/libgdbm.so.3 (0x00007fb0e4779000)
  4.         libz.so.1 => /usr/lib/libz.so.1 (0x00007fb0e4562000)
  5.         libc.so.6 => /lib/libc.so.6 (0x00007fb0e41de000)
  6.         /lib64/ld-linux-x86-64.so.2 (0x00007fb0e4bdb000)
复制代码
第一行和最后一行就会出现问题(第一行的三个变量不是具体的so文件指向,最后一行根本没有第三个变量):
  1. fmying@EagleNest:~$ ldd /usr/bin/man | awk -F ' ' '{print $3}'
  2. (0x00007ffff43ff000)
  3. /usr/lib/libgdbm.so.3
  4. /usr/lib/libz.so.1
  5. /lib/libc.so.6
  6. (空行)
复制代码
改了一下那个命令:
  1. fmying@EagleNest:~$ ldd /usr/bin/man | awk -F ' ' '{if (index($3,"so") == 0) {print $1} else {print $3}}' | sed -ne "/^\//p"
  2. /usr/lib/libgdbm.so.3
  3. /usr/lib/libz.so.1
  4. /lib/libc.so.6
  5. /lib64/ld-linux-x86-64.so.2
复制代码
第一行的linux-vdso.so.1是个虚拟库,不考虑复制。awk中的“if else”是针对第一行和最后一行加的,保证显示动态库文件,而不是那些内存地址什么的东西。最后一个sed是将第一行的linux-vdso.so.1去掉,保证显示的都是硬盘上的真实的文件。

最终的代码和运行结果(还是以man命令为例)如下:
  1. fmying@EagleNest:~/test$ for file in `ldd /usr/bin/man | awk -F ' ' '{if (index($3,"so") == 0) {print $1} else {print $3}}' | sed -ne "/^\//p"`; do cp -v $file .; done
  2. "/usr/lib/libgdbm.so.3" -> "./libgdbm.so.3"
  3. "/usr/lib/libz.so.1" -> "./libz.so.1"
  4. "/lib/libc.so.6" -> "./libc.so.6"
  5. "/lib64/ld-linux-x86-64.so.2" -> "./ld-linux-x86-64.so.2"
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表