ROM Tools 13.1.0.1
Bug468 initialized static data built into a static library does not get initialized correctly
# 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;