0

私は 20 年前のプロジェクトに取り組んでおり、その中にはいくつかの...興味深い問題があります。循環依存関係を持つ共有オブジェクトがいくつかあります。

私はすべてのライブラリ間の関係をマッピングしようとしていますが、不足している依存関係を満たすことができるものを確認するためにライブラリのリストを検索できる既存のツールがあれば、かなり役に立ちます。

参考までに、彼らは次のようなことをして問題を回避しました。

# True list of dependencies:
A: B
B: A
C: A

# Dependencies used in practice:
A:
B: A
C: A B
4

1 に答える 1

0

これをメモリから書き直そうとしたので、次のコードはテストしていませんが、これを解決するために以前に書いたコード(おおよそこれに似ています)は正常に機能します:

#!/usr/bin/env perl

using IPC::Open3;

my $queryFile = $ARGV[0];
shift;

my %missingSymbols = getSymbols( "nm -Aau", $queryFile );

my %symtbl;

foreach $lib ( @ARGV ) {
  my %temp = getSymbols( "nm -Aa --defined-only", $lib );

  foreach $key ( keys( %temp ) ) {
    $symtbl{$key} =   (defined($symtbl{$key}) ? "${symtbl{$key}} " : "")
                    . $temp{$key};
  }
}

my %dependencies;
foreach $symbol ( keys( %missingSymbols  ) ) {
  if( defined( $symtbl{$symbol} ) ) {
    foreach $lib ( split( / +/, $symtbl{$symbol} ) ) {
      if( !defined( $dependencies{$lib} ) ) {
        $dependencies{$lib} = 1;
      }
    }
  }
}

if( scalar( keys( %dependencies ) ) > 0 ) {
  print( "$queryFile depends on one or more of the following libs:\n\n" );

  print join( "\n", sort( keys( %dependencies ) ) ) . "\n\n";
} else {
  print( "Unable to resolve dependencies for $queryFile.\n\n" );
}

# Done.

sub getSymbols {
  my $cmd   = shift;
  my $fname = shift;

  checkFileType( $fname );

  open3( IN, OUT, ERR, "$cmd $fname" );

  my %symhash;
  close( IN );
  # If you leave ERR open and nm prints to STDERR, reads from
  # OUT can block.  You could make reads from both handles be
  # non-blocking so you could examine STDERR if needed, but I
  # don't need to.
  close( ERR );

  while( <OUT> ) {
    chomp;
    if( m/^(?:[^:]*:)+[a-zA-Z0-9]*\s*[a-zA-Z] ([^\s]+)$/ ) {
      my $temp = defined( $symhash{$1} ) ? "${symhash{$1}} " : "";
      $symhash{$1} = $temp . $fname;
    }
  }
  close( OUT );

  return %symhash;
}

sub checkFileType {
  my $fname = shift;

  die "$fname does not exist\n" if( ! -e $fname );
  die "Not an ELF or archive file\n" if( `file $fname` !~ m/ELF| ar archive/ );
}
于 2012-04-21T07:59:48.017 に答える