sbsv1/abld/platform/findimp.pl
changeset 599 fa7a3cc6effd
equal deleted inserted replaced
596:9f25be3da657 599:fa7a3cc6effd
       
     1 # Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 # All rights reserved.
       
     3 # This component and the accompanying materials are made available
       
     4 # under the terms of "Eclipse Public License v1.0"
       
     5 # which accompanies this distribution, and is available
       
     6 # at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 #
       
     8 # Initial Contributors:
       
     9 # Nokia Corporation - initial contribution.
       
    10 #
       
    11 # Contributors:
       
    12 #
       
    13 # Description:
       
    14 #
       
    15 
       
    16 my $argc=scalar(@ARGV);
       
    17 $argc==2 or die "findimp <map file> <output file>\n";
       
    18 my $infile=@ARGV[0];
       
    19 my $outfile=@ARGV[1];
       
    20 
       
    21 my @imp_dll_names;
       
    22 my @imp_dll_ordinal_lists;
       
    23 my $i=0;
       
    24 open INFILE, $infile or die "Can't open input file $infile\n";
       
    25 while (<INFILE>) {
       
    26 	if (/^\s*(\d+)\:(([0-9|a-f|A-F])+)\s+__imp_(\S+)\s+(([0-9|a-f|A-F])+)\s+(\S+?)\:(.*?)\s*$/) {
       
    27 		my $section_num=$1;
       
    28 		my $section_offset=hex $2;
       
    29 		my $import_name="__imp_$4";
       
    30 		my $addr=$5;
       
    31 		my $dllname=$8;
       
    32 		my $implist;
       
    33 		for ($i=0; $i<scalar(@imp_dll_names); ++$i) {
       
    34 			if ($imp_dll_names[$i] eq $dllname) {
       
    35 				$implist=$imp_dll_ordinal_lists[$i];
       
    36 				push @$implist, $section_offset;				
       
    37 				last;
       
    38 			}
       
    39 		}
       
    40 		if ($i==scalar(@imp_dll_names)) {
       
    41 			my @new_list;
       
    42 			push @new_list, $section_offset;
       
    43 			push @imp_dll_names, $dllname;
       
    44 			push @imp_dll_ordinal_lists, \@new_list;
       
    45 		}
       
    46 	}
       
    47 }
       
    48 close INFILE;
       
    49 my $noffset=4;
       
    50 my $n_imp_dlls=scalar(@imp_dll_names);
       
    51 for ($i=0; $i<$n_imp_dlls; ++$i) {
       
    52 	$noffset+=8;
       
    53 	my $implist=$imp_dll_ordinal_lists[$i];
       
    54 	foreach (@$implist) {
       
    55 		$noffset+=4;
       
    56 	}
       
    57 }
       
    58 open OUTFILE, ">$outfile" or die "Can't open output file $outfile\n";
       
    59 binmode OUTFILE;
       
    60 printf OUTFILE "%c%c%c%c",$n_imp_dlls&0xff,($n_imp_dlls>>8)&0xff,($n_imp_dlls>>16)&0xff,$n_imp_dlls>>24;
       
    61 $i=0;
       
    62 for ($i=0; $i<$n_imp_dlls; ++$i) {
       
    63 	my $nlen=length $imp_dll_names[$i];
       
    64 	printf OUTFILE "%c%c%c%c",$noffset&0xff,($noffset>>8)&0xff,($noffset>>16)&0xff,$noffset>>24;
       
    65 	$noffset+=$nlen + 1;
       
    66 	my $implist=$imp_dll_ordinal_lists[$i];
       
    67 	my $nimp=scalar(@$implist);
       
    68 	printf OUTFILE "%c%c%c%c",$nimp&0xff,($nimp>>8)&0xff,($nimp>>16)&0xff,$nimp>>24;
       
    69 	foreach (@$implist) {
       
    70 		printf OUTFILE "%c%c%c%c",$_&0xff,($_>>8)&0xff,($_>>16)&0xff,$_>>24;
       
    71 	}
       
    72 }
       
    73 for ($i=0; $i<$n_imp_dlls; ++$i) {
       
    74 	print OUTFILE $imp_dll_names[$i];
       
    75 	printf OUTFILE "%c",0;
       
    76 }
       
    77 close OUTFILE;