# HG changeset patch # User William Roberts # Date 1278513829 -3600 # Node ID cb10ec12dc45b34a94c62c796e72d069cff789dc # Parent c38b26fd0c689ffcdcd7075fc453053b0ad769b0 Lots of fixes and adjustments to help understand the linkage problems diff -r c38b26fd0c68 -r cb10ec12dc45 tools/summarise_gcc_errors.pl --- a/tools/summarise_gcc_errors.pl Mon Jun 21 18:22:54 2010 +0100 +++ b/tools/summarise_gcc_errors.pl Wed Jul 07 15:43:49 2010 +0100 @@ -191,6 +191,7 @@ } # M:/sf/os/kernelhwsrv/kernel/eka/drivers/soundsc/soundldd.cpp:2927: undefined reference to `__aeabi_uidiv' + # M:/epoc32/build/rawipnif/c_6f716cf505597250/rawip_dll/armv5/udeb/rawipmcpr.o:(.rodata+0x258): undefined reference to `non-virtual thunk to CAgentMetaConnectionProvider::GetIntSettingL(TDesC16 const&, unsigned long&, ESock::MPlatsecApiExt*)' # M:/epoc32/include/elements/nm_interfaces.h:255: warning: dereferencing type-punned pointer will break strict-aliasing rules # M:/epoc32/include/f32file.h:2169: warning: invalid access to non-static data member 'TVolFormatParam::iUId' of NULL object @@ -199,7 +200,7 @@ # M:/epoc32/include/elements/nm_signatures.h:496: error: provided for 'template class Messages::TSignatureWithPolymorphicPayloadMetaType' # M:/epoc32/include/comms-infras/ss_nodemessages.h:301: error: invalid type in declaration before ';' token - if ($line =~ /(^...*):(\d+): (([^:]+): )?(.*)$/) + if ($line =~ /(^...*):(\d+|\(\S+\)): (([^:]+): )?(.*)$/) { my $filename = $1; my $lineno = $2; @@ -270,6 +271,7 @@ # Elf2e32: Warning: New Symbol _ZN15DMMCMediaChangeC1Ei found, export(s) not yet Frozen # elf2e32 : Error: E1036: Symbol _ZN21CSCPParamDBControllerD0Ev,_ZN21CSCPParamDBControllerD1Ev,_ZN21CSCPParamDBControllerD2Ev Missing from ELF File : M:/epoc32/release/armv5/udeb/scpdatabase.dll.sym. + # elf2e32 : Error: E1053: Symbol _Z24ImplementationGroupProxyRi passed through '--sysdef' option is not at the specified ordinal in the DEF file M:/sf/mw/svgt/svgtopt/svgtplugin/BWINSCW/NPSVGTPLUGINu.DEF. if ($line =~ /^elf2e32 ?: ([^:]+): (.*)$/oi) { @@ -298,6 +300,15 @@ $excess_export{"$current_package\t???\t$symbol\textra in $current_link_target"} = 1; next; } + + # Symbol _Z24ImplementationGroupProxyRi passed through '--sysdef' option is not at the specified ordinal in the DEF file M:/sf/mw/svgt/svgtopt/svgtplugin/BWINSCW/NPSVGTPLUGINu.DEF. + if ($message =~ /Symbol (\S+) passed .* DEF file .:(.*)\.$/oi) + { + my $symbol = $1; + my $deffile = $2; + $missing_export{"$current_package\t$deffile\t$symbol\tmisplaced in $current_link_target"} = 1; + next; + } } } @@ -352,7 +363,7 @@ { my ($root, $sf, $layer, $packagename, @rest) = split /[\/\\]/, $file; my $package = "$sf/$layer/$packagename"; - if ($layer eq "include") + if ($sf eq "epoc32") { $package = "$sf/$layer"; } @@ -441,10 +452,76 @@ my @simple_exports = (); my @vague_exports = (); -foreach my $problem (keys %missing_export) +my $last_elffile = ""; +my @last_objdump = (); +foreach my $problem (sort {substr($a,-12) cmp substr($b,-12)} keys %missing_export) { my ($package,$file,$symbol,$impact) = split /\t/, $problem; - if ($symbol =~ /^(_ZN\d|[^_]|__)/) + if ($impact =~ /impacts ..\/(.*)/) + { + my $e32file = $1; + my $elffile = $e32file . ".sym"; + my $objdumplist = $elffile . ".txt"; + my @instances = (); + if (-e $elffile && $last_elffile ne $elffile) + { + # cache miss + if (-e $objdumplist && -s $objdumplist > 0) + { + open OBJDUMPLIST, "<$objdumplist"; + @last_objdump = ; + close OBJDUMPLIST; + } + else + { + open OBJDUMP, "arm-none-symbianelf-objdump --sym $elffile |"; + @last_objdump = ; + close OBJDUMP; + open OBJDUMPLIST, ">$objdumplist" or print STDERR "Failed to write $objdumplist: $!\n"; + print OBJDUMPLIST @last_objdump; + close OBJDUMPLIST; + } + $last_elffile = $elffile; + } + foreach my $line (@last_objdump) + { + if (index($line,$symbol) >= 0) + { + push @instances, $line; + } + } + close OBJDUMP; + + printf STDERR "Checked %s for %s, found %d instances\n", $elffile, $symbol, scalar @instances; + print STDERR join("\n", @instances, ""); + + if (scalar @instances == 0) + { + $problem = "$package\t$elffile\t$symbol\tmissing\t$file"; + } + if (scalar @instances == 1) + { + my $flags = ""; + if ($instances[0] =~ /^.{8} (.{7}) /) + { + $flags = " (".$1.")"; + $flags =~ s/ //g; # throw away the spaces + } + if (index($instances[0], ".hidden") > 0) + { + $problem = "$package\t$elffile\t$symbol\thidden$flags\t$file"; + } + else + { + $problem = "$package\t$elffile\t$symbol\tvisible$flags\t$file"; + } + } + if (scalar @instances > 1) + { + $problem = "$package\t$elffile\t$symbol\trepeated\t$file"; + } + } + if ($symbol =~ /^(_ZNK?\d|[^_]|__)/) { push @simple_exports, $problem; } @@ -463,7 +540,7 @@ foreach my $problem (keys %excess_export) { my ($package,$file,$symbol,$impact) = split /\t/, $problem; - if ($symbol =~ /^(_ZN\d|_Z\d|[^_]|__)/) + if ($symbol =~ /^(_ZNK?\d|_Z\d|[^_]|__)/) { push @simple_exports, $problem; } @@ -472,7 +549,6 @@ push @vague_exports, $problem; } } - printf "\n\n====Simple unfrozen exports found in linked ELF executables - (%d)\n", scalar @simple_exports; print join("\n", sort @simple_exports, ""); printf "\n\n====Vague linkage unfrozen exports found in linked ELF executables - (%d)\n", scalar @vague_exports;