sbsv1/abld/platform/findimp.pl
changeset 599 fa7a3cc6effd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/findimp.pl	Fri Jun 25 17:29:25 2010 +0800
@@ -0,0 +1,77 @@
+# Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+my $argc=scalar(@ARGV);
+$argc==2 or die "findimp <map file> <output file>\n";
+my $infile=@ARGV[0];
+my $outfile=@ARGV[1];
+
+my @imp_dll_names;
+my @imp_dll_ordinal_lists;
+my $i=0;
+open INFILE, $infile or die "Can't open input file $infile\n";
+while (<INFILE>) {
+	if (/^\s*(\d+)\:(([0-9|a-f|A-F])+)\s+__imp_(\S+)\s+(([0-9|a-f|A-F])+)\s+(\S+?)\:(.*?)\s*$/) {
+		my $section_num=$1;
+		my $section_offset=hex $2;
+		my $import_name="__imp_$4";
+		my $addr=$5;
+		my $dllname=$8;
+		my $implist;
+		for ($i=0; $i<scalar(@imp_dll_names); ++$i) {
+			if ($imp_dll_names[$i] eq $dllname) {
+				$implist=$imp_dll_ordinal_lists[$i];
+				push @$implist, $section_offset;				
+				last;
+			}
+		}
+		if ($i==scalar(@imp_dll_names)) {
+			my @new_list;
+			push @new_list, $section_offset;
+			push @imp_dll_names, $dllname;
+			push @imp_dll_ordinal_lists, \@new_list;
+		}
+	}
+}
+close INFILE;
+my $noffset=4;
+my $n_imp_dlls=scalar(@imp_dll_names);
+for ($i=0; $i<$n_imp_dlls; ++$i) {
+	$noffset+=8;
+	my $implist=$imp_dll_ordinal_lists[$i];
+	foreach (@$implist) {
+		$noffset+=4;
+	}
+}
+open OUTFILE, ">$outfile" or die "Can't open output file $outfile\n";
+binmode OUTFILE;
+printf OUTFILE "%c%c%c%c",$n_imp_dlls&0xff,($n_imp_dlls>>8)&0xff,($n_imp_dlls>>16)&0xff,$n_imp_dlls>>24;
+$i=0;
+for ($i=0; $i<$n_imp_dlls; ++$i) {
+	my $nlen=length $imp_dll_names[$i];
+	printf OUTFILE "%c%c%c%c",$noffset&0xff,($noffset>>8)&0xff,($noffset>>16)&0xff,$noffset>>24;
+	$noffset+=$nlen + 1;
+	my $implist=$imp_dll_ordinal_lists[$i];
+	my $nimp=scalar(@$implist);
+	printf OUTFILE "%c%c%c%c",$nimp&0xff,($nimp>>8)&0xff,($nimp>>16)&0xff,$nimp>>24;
+	foreach (@$implist) {
+		printf OUTFILE "%c%c%c%c",$_&0xff,($_>>8)&0xff,($_>>16)&0xff,$_>>24;
+	}
+}
+for ($i=0; $i<$n_imp_dlls; ++$i) {
+	print OUTFILE $imp_dll_names[$i];
+	printf OUTFILE "%c",0;
+}
+close OUTFILE;