# HG changeset patch # User Tom Pritchard # Date 1288189550 -3600 # Node ID 458d62869c00622b367421368d1893cbc4eea071 # Parent 303d3e345b01b39efffaf2f225300d8a703737ad# Parent 9b61d901414f657f9dffe3199475dea8e6f093ef Merge william's latest changes before pushing diff -r 303d3e345b01 -r 458d62869c00 breakdeps/CONE.MMP --- a/breakdeps/CONE.MMP Wed Oct 27 15:24:40 2010 +0100 +++ b/breakdeps/CONE.MMP Wed Oct 27 15:25:50 2010 +0100 @@ -27,6 +27,7 @@ targettype DLL UID 0x1000008D 0x10003A41 VENDORID 0x70000001 +NOEXPORTLIBRARY userinclude /sf/mw/classicui/lafagnosticuifoundation/cone/inc USERINCLUDE /sf/mw/classicui/lafagnosticuifoundation/cone/src diff -r 303d3e345b01 -r 458d62869c00 breakdeps/EIKSRVUI.MMP --- a/breakdeps/EIKSRVUI.MMP Wed Oct 27 15:24:40 2010 +0100 +++ b/breakdeps/EIKSRVUI.MMP Wed Oct 27 15:25:50 2010 +0100 @@ -24,18 +24,13 @@ TARGET stem_eiksrvui.dll TARGETTYPE dll UID 0x1000008D 0x100053D0 +NOEXPORTLIBRARY CAPABILITY CAP_GENERAL_DLL VENDORID VID_DEFAULT SOURCEPATH /sf/mw/classicui/uifw/eikstd/srvuisrc -START RESOURCE EIKSRVUI.RSS -HEADER -TARGETPATH RESOURCE_FILES_DIR -LANGUAGE_IDS -END - USERINCLUDE /sf/mw/classicui/uifw/eikstd/srvuisrc USERINCLUDE /sf/mw/classicui/uifw/eikstd/inc USERINCLUDE /sf/mw/classicui/uifw/AvKon/inc diff -r 303d3e345b01 -r 458d62869c00 breakdeps/SVGEngine.mmp --- a/breakdeps/SVGEngine.mmp Wed Oct 27 15:24:40 2010 +0100 +++ b/breakdeps/SVGEngine.mmp Wed Oct 27 15:25:50 2010 +0100 @@ -29,9 +29,10 @@ VENDORID VID_DEFAULT UID 0x1000008D 0x101F856E +NOEXPORTLIBRARY - #if defined( ARMCC ) + #if defined( EABI ) deffile /sf/mw/svgt/svgtopt/SVG/SVGEngine/eabi/SVGENGINE-OpenVG.def #elif defined( WINSCW ) deffile /sf/mw/svgt/svgtopt/SVG/SVGEngine/BWINSCW/SVGENGINE-OpenVG.def diff -r 303d3e345b01 -r 458d62869c00 breakdeps/avkon.mmp --- a/breakdeps/avkon.mmp Wed Oct 27 15:24:40 2010 +0100 +++ b/breakdeps/avkon.mmp Wed Oct 27 15:25:50 2010 +0100 @@ -23,6 +23,7 @@ TARGET stem_avkon.dll TARGETTYPE dll UID 0x1000008D 0x100056C6 +NOEXPORTLIBRARY CAPABILITY CAP_GENERAL_DLL VENDORID VID_DEFAULT diff -r 303d3e345b01 -r 458d62869c00 breakdeps/backend.mmp --- a/breakdeps/backend.mmp Wed Oct 27 15:24:40 2010 +0100 +++ b/breakdeps/backend.mmp Wed Oct 27 15:25:50 2010 +0100 @@ -25,6 +25,7 @@ TARGET stem_backend.dll TARGETTYPE dll UID 0x1000008d 0x102828D5 +NOEXPORTLIBRARY LANG SC CAPABILITY ALL -TCB diff -r 303d3e345b01 -r 458d62869c00 group/bld.inf --- a/group/bld.inf Wed Oct 27 15:24:40 2010 +0100 +++ b/group/bld.inf Wed Oct 27 15:25:50 2010 +0100 @@ -17,7 +17,9 @@ */ PRJ_PLATFORMS -DEFAULT +ARMV5 +// no tools +// Don't build WINSCW because the system startup uses all of the resource files it can find! PRJ_MMPFILES diff -r 303d3e345b01 -r 458d62869c00 startup/ssmstartuppolicy.mmp --- a/startup/ssmstartuppolicy.mmp Wed Oct 27 15:24:40 2010 +0100 +++ b/startup/ssmstartuppolicy.mmp Wed Oct 27 15:25:50 2010 +0100 @@ -22,6 +22,7 @@ TARGET stem_ssm.state.policy.0000.dll TARGETTYPE dll UID 0x2000D75D 0x20021346 +NOEXPORTLIBRARY CAPABILITY PowerMgmt ReadDeviceData WriteDeviceData ProtServ DiskAdmin SwEvent VENDORID VID_DEFAULT diff -r 303d3e345b01 -r 458d62869c00 tools/bulk_marking.pl --- a/tools/bulk_marking.pl Wed Oct 27 15:24:40 2010 +0100 +++ b/tools/bulk_marking.pl Wed Oct 27 15:25:50 2010 +0100 @@ -16,17 +16,22 @@ use strict; use Getopt::Long; -my $marking; +my $newcmd = ""; my $who; +my $marking; +my $other_exes = 0; GetOptions( + "c|command=s" => \$newcmd, # value for the What colum (can be blank) "m|message=s" => \$marking, # comment to add to the CSV lines "u|user=s" => \$who, # value for the Who column + "x" => \$other_exes, # marking is applied to exes NOT listed ); die("must specify a value for the Why column with the -m option") if (!defined $marking); die("must specify a value for the Who column with the -u option") if (!defined $who); my %romfiles; +my $mark_count = 0; my $line; while ($line=<>) { @@ -34,25 +39,56 @@ if ($line =~ /^\S+\t\S+\t(\S+)/) { my $romfile = $1; - $romfiles{$romfile} = 1; + $romfiles{lc $romfile} = 1; next; } my ($romfile,$hostfile,$ibyfile,$package,$cmd,@rest) = split /,/, $line; - next if (!defined $cmd); - - if (defined $romfiles{$romfile}) + if (!defined $cmd) { - if ($cmd eq "") + if ($other_exes && $line =~ /^(\S+)$/) { - # mark this one - print join(",", $romfile,$hostfile,$ibyfile,$package,"",$who,$marking), "\n"; - next; + # guess that this is a preserved filename + my $exe = "sys\\bin\\". lc $1; + $romfiles{$exe} = 1; + # print STDERR "Preserving $exe\n"; } - else + next; + } + + if ($cmd ne "") + { + print $line; # already marked, so leave it alone + next; + } + + my $mark_me = 0; + if ($other_exes) + { + if ($romfile =~ /^sys.bin.(.*)$/i) { - print STDERR "Skipping $romfile line - already marked as $cmd,",join(",", @rest); + # this is an exe - are we tagging it? + if (!defined $romfiles{lc $romfile}) + { + # print STDERR "Marking $romfile\n"; + $mark_me = 1; + } } } - print $line; + elsif (defined $romfiles{lc $romfile}) + { + $mark_me = 1; + } + + if ($mark_me) + { + $mark_count += 1; + print join(",", $romfile,$hostfile,$ibyfile,$package,$newcmd,$who,$marking), "\n"; + } + else + { + print $line; + } } + +print STDERR "Marked $mark_count lines\n"; diff -r 303d3e345b01 -r 458d62869c00 tools/filter_obyfile.pl --- a/tools/filter_obyfile.pl Wed Oct 27 15:24:40 2010 +0100 +++ b/tools/filter_obyfile.pl Wed Oct 27 15:25:50 2010 +0100 @@ -43,6 +43,7 @@ my %rom_origins; my %deletions; my %must_have; +my %check_import_details; foreach my $line (@rom_content) { my ($romfile,$hostfile,$ibyfile,$package,$cmd,@rest) = split /,/, $line; @@ -51,6 +52,14 @@ next if ($cmd eq ""); $cmd = lc $cmd; + if ($cmd eq "slim") + { + $check_import_details{$romfile} = ""; + $stem_substitutions{$romfile} = $hostfile; + $must_have{$romfile} = 1; + next; + } + if ($cmd eq "stem") { $stem_substitutions{$romfile} = $hostfile; @@ -72,15 +81,17 @@ } } -printf STDERR "%d in (including %d stem), %d out\n", +printf STDERR "%d in (including %d slim and %d stem), %d out\n", scalar keys %must_have, - scalar keys %stem_substitutions, + scalar keys %check_import_details, + (scalar keys %stem_substitutions) - (scalar keys %check_import_details), scalar keys %deletions; # read static dependencies file my %exe_to_romfile; # exe -> original romfile my %exe_dependencies; # exe -> list of romfile my %exe_prerequisites; # exe -> list of exe +my %exe_ordinals; # exe -> list of valid ordinals my %lc_romfiles; my $line; @@ -96,7 +107,7 @@ { if ($hostfile !~ /\/stem_/) { - print STDERR "Ignoring dependencies of $hostfile because of stem substitution of $romfile\n"; + # print STDERR "Ignoring dependencies of $hostfile because of stem substitution of $romfile\n"; next; } } @@ -114,6 +125,15 @@ foreach my $prerequisite (split /:/,$stuff) { next if ($prerequisite =~ /^sid=/); # not a real file + if ($prerequisite =~ /^exports=(.*)$/) + { + my $ordinals = $1; + if (defined $check_import_details{$romfile}) + { + $exe_ordinals{$romexe} = $ordinals; + } + next; + } $prerequisite =~ s/^sys.bin.//; # remove leading sys/bin, if present if ($prerequisite !~ /\\/) { @@ -121,6 +141,8 @@ $exe =~ s/\[\S+\]//; # ignore the UIDs for now push @prerequisite_exes, $exe; + $exe =~ s/@.*$//; # remove the ordinals, though they remain in the prerequisite exes + if (!defined $exe_dependencies{$exe}) { my @dependents = ($romfile); @@ -179,13 +201,12 @@ if (0) { - foreach my $exe ("libopenvg.dll", "libopenvg_sw.dll", "backend.dll") + foreach my $exe ("libopenvg.dll", "libopenvg_sw.dll", "backend.dll", "qtgui.dll") { printf STDERR "Dependents of %s = %s\n", $exe, join(", ", @{$exe_dependencies{$exe}}); } } -# process the "out" commands to recursively expand the deletions my @details; sub print_detail($) @@ -195,6 +216,90 @@ print STDERR $message, "\n"; } +# check the dependents of "slim" DLLs to see if they get eliminated by missing ordinals + +sub expand_list($$) + { + my ($hashref, $list) = @_; + foreach my $range (split /\./, $list) + { + if ($range =~ /^(\d+)-(\d+)$/) + { + foreach my $ordinal ($1 .. $2) + { + $$hashref{$ordinal} = 1; + } + } + else + { + $$hashref{$range} = 1; + } + } + } +sub check_list($$) + { + my ($hashref, $list) = @_; + foreach my $range (split /\./, $list) + { + if ($range =~ /^(\d+)-(\d+)$/) + { + foreach my $ordinal ($1 .. $2) + { + if (!defined $$hashref{$ordinal}) + { + return "Missing ordinal $ordinal"; + } + } + } + else + { + return "Missing ordinal $range" if (!defined $$hashref{$range}); + } + } + return "OK"; + } + + +foreach my $romexe (keys %exe_ordinals) + { + my $exported_ordinals = $exe_ordinals{$romexe}; + my %exports; + expand_list(\%exports, $exported_ordinals); + my $namelength = length($romexe); + foreach my $dependent (@{$exe_dependencies{$romexe}}) + { + next if (defined $deletions{$dependent}); # already + + if ($dependent =~ /^sys.bin.(.*)$/i) + { + my $depexe = lc $1; + my $imports; + foreach my $prerequisite (@{$exe_prerequisites{$depexe}}) + { + if (substr($prerequisite, 0, $namelength) eq $romexe) + { + $imports = substr($prerequisite, $namelength+1); # skip name and "@" + last; + } + } + if (!defined $imports) + { + printf STDERR "Failed to find ordinals imported from %s by %s (in %s)\n", + $romexe, $dependent, join(":",@{$exe_prerequisites{$depexe}}); + next; + } + my $compatible = check_list(\%exports,$imports); + if ($compatible ne "OK") + { + $deletions{$dependent} = "$romexe $compatible"; + # print_detail("Deleting $dependent because of slimmed $romexe ($compatible)"); + } + } + } + } + +# process the "out" commands to recursively expand the deletions + my @problems; # list of romtrails which will be a problem sub delete_dependents($$$) { @@ -246,8 +351,9 @@ { push @details, "", "===Deleting $romfile", ""; + my $reason = $deletions{$romfile}; delete $deletions{$romfile}; # so that delete_dependents will iterate properly - my @delete_list = ("$romfile\tout"); + my @delete_list = ("$romfile\t$reason"); while (scalar @delete_list > 0) { my $next_victim = shift @delete_list; @@ -379,6 +485,7 @@ } foreach my $prerequisite (@{$exe_prerequisites{$exe}}) { + $prerequisite =~ s/@.*$//; # remove any ordinal information mark_prerequisites($prerequisite); } } @@ -463,6 +570,7 @@ } print FILE "\n====\n"; + printf FILE "Minimum ROM now has %d exes\n", scalar keys %must_have_exes; foreach my $deletion_root (sort {$b <=> $a} @deletion_roots) { my ($count,$exe) = split /\s+/, $deletion_root; diff -r 303d3e345b01 -r 458d62869c00 tools/static_dependencies.pl --- a/tools/static_dependencies.pl Wed Oct 27 15:24:40 2010 +0100 +++ b/tools/static_dependencies.pl Wed Oct 27 15:25:50 2010 +0100 @@ -34,17 +34,32 @@ my %romfiles; my @contents; +my %need_details; my $line; while ($line = <>) { my ($romfile,$hostfile,$ibyfile,$package,$cmd,@columns) = split /,/, $line; # first 5 fields are guaranteed to be simple - next if (!defined $hostfile); next if ($romfile eq "ROM file"); # skip header line + if (!defined $hostfile) + { + # is it perhaps a static_dependencies.txt line? + my $dependencies; + my $nothing; + ($romfile,$hostfile,$dependencies,$nothing) = split /\t/, $line; + next if (defined $nothing || !defined $hostfile); + $cmd = ""; + } - if (lc $cmd eq "stem") + if (lc $cmd eq "slim") { - $hostfile =~ s/(\/|\\)([^\\\/]+)$/$1stem_$2/; # use stem version instead + $need_details{lc $romfile} = 1; + $cmd = "stem"; # slim implies stem + } + if (lc $cmd eq "stem" && $hostfile !~ /stem_/) + { + push @contents, "$romfile\t$hostfile"; # calculate dependencies for the original file + $hostfile =~ s/(\/|\\)([^\\\/]+)$/$1stem_$2/; # then use stem version as well } push @contents, "$romfile\t$hostfile"; $romfiles{lc $romfile} = $romfile; @@ -69,7 +84,7 @@ if (defined $deps) { $romfile = canonical_romfile($romfile); - $outputlines{$romfile} = "$romfile\t$hostfile\t$deps"; + $outputlines{"$romfile\t$hostfile"} = "$romfile\t$hostfile\t$deps"; } } @@ -78,7 +93,7 @@ sub print_dependency($$@) { my ($romfile,$hostfile,@dependencies) = @_; - $outputlines{$romfile} = "$romfile\t$hostfile\t". join(":",@dependencies); + $outputlines{"$romfile\t$hostfile"} = "$romfile\t$hostfile\t". join(":",@dependencies); next unless $inverted_table; @@ -102,6 +117,48 @@ } } +sub summarise_list($) + { + my ($hashref) = @_; + my @summary; + my @list = sort {$a <=> $b} keys %$hashref; + my $first = shift @list; + my $latest = $first; + foreach my $number (@list) + { + if ($number == $latest + 1) + { + # extends existing range by one + $latest = $latest + 1; + next; + } + # new range + if ($first > -1) + { + if ($latest == $first) + { + # Range with one element + push @summary, $first; + } + else + { + push @summary, "$first-$latest"; + } + } + $first = $number; + $latest = $number; + } + if ($latest == $first) + { + push @summary, "$first"; + } + else + { + push @summary, "$first-$latest"; + } + return join(".", @summary); + } + sub generate_elftran_dependencies($$) { my ($romfile,$hostfile) = @_; @@ -113,13 +170,50 @@ my $sid; my @imports; + my $dll; + my $importing = 0; + my %ordinals; + my %exports; foreach my $line (@elftran) { + # Ordinal 318: 00010f9f + if ($line =~ /Ordinal\s+(\d+):\s+(ABSENT)?/) + { + $exports{$1} = 1 unless ($2 eq "ABSENT"); + next; + } + # 2 imports from backend{00010001}[102828d5].dll # 17 imports from dfpaeabi{000a0000}.dll - if ($line =~ /imports from (\S+)\{.{8}\}(\S+)$/) + if ($line =~ /(\d+) imports from (\S+)\{.{8}\}(\S+)$/) { - push @imports, $1.$2; + $dll = $2.$3; + my $import_count = $1; + my $exename = "sys\\bin\\". lc $dll; + $exename =~ s/\[\S+\]//; # ignore the UID + if (defined $need_details{$exename}) + { + # enable the tracking of the imported ordinals + $importing = $import_count; + %ordinals = (); + } + else + { + # Just report the simple reference to the imported dll + $importing = 0; + push @imports, $dll; + } + next; + } + if ($importing && $line =~ /^\s+(\d+)( offset by \d+)?$/) + { + $ordinals{$1} = 1; + $importing -= 1; + if ($importing == 0) + { + $dll = $dll. "@". summarise_list(\%ordinals); + push @imports, $dll; + } next; } if ($line =~ /^Secure ID: (\S+)$/) @@ -128,7 +222,13 @@ next; } } - print_dependency($romfile,$hostfile,"sid=$sid",@imports); + + my @export_info = (); + if (scalar keys %exports && $need_details{lc $romfile}) + { + push @export_info, "exports=".summarise_list(\%exports); + } + print_dependency($romfile,$hostfile, @export_info, "sid=$sid",@imports); } sub find_exe_names_dependencies($$)