Removed obsolete code. Fixed syntax errors. Fixed cross-platform issues.
diff --git a/abi-compliance-checker.pl b/abi-compliance-checker.pl
index e10741f..73ff9f3 100755
--- a/abi-compliance-checker.pl
+++ b/abi-compliance-checker.pl
@@ -83,7 +83,7 @@
my ($Help, $ShowVersion, %Descriptor, $TargetLibraryName,
$TestTool, $DumpAPI, $SymbolsListPath, $CheckHeadersOnly_Opt, $UseDumps,
-$CheckObjectsOnly_Opt, $AppPath, $StrictCompat, $DumpVersion, $ParamNamesPath,
+$AppPath, $StrictCompat, $DumpVersion, $ParamNamesPath,
%RelativeDirectory, $TargetTitle, $TestDump, $LoggingPath,
%TargetVersion, $InfoMsg, $CrossGcc, %OutputLogPath,
$OutputReportPath, $OutputDumpPath, $ShowRetVal, $SystemRoot_Opt, $DumpSystem,
@@ -179,26 +179,6 @@
exit(0);
}
-foreach (2 .. $#ARGV)
-{ # correct comma separated options
- if($ARGV[$_-1] eq ",")
- {
- $ARGV[$_-2].=",".$ARGV[$_];
- splice(@ARGV, $_-1, 2);
- }
- elsif($ARGV[$_-1]=~/,\Z/)
- {
- $ARGV[$_-1].=$ARGV[$_];
- splice(@ARGV, $_, 1);
- }
- elsif($ARGV[$_]=~/\A,/
- and $ARGV[$_] ne ",")
- {
- $ARGV[$_-1].=$ARGV[$_];
- splice(@ARGV, $_, 1);
- }
-}
-
GetOptions("h|help!" => \$Help,
"i|info!" => \$InfoMsg,
"v|version!" => \$ShowVersion,
@@ -225,7 +205,6 @@
"skip-headers=s" => \$SkipHeadersPath,
"header=s" => \$TargetHeader,
"headers-only|headers_only!" => \$CheckHeadersOnly_Opt,
- "objects-only!" => \$CheckObjectsOnly_Opt,
"show-retval!" => \$ShowRetVal,
"use-dumps!" => \$UseDumps,
"nostdinc!" => \$NoStdInc,
@@ -465,17 +444,6 @@
none
</libs>
- -objects-only
- Check $SLIB_TYPE libraries without header files. It is easy to run, but may
- provide a low quality compatibility report with false positives and
- without analysis of changes in parameters and data types.
-
- Alternatively you can write \"none\" word to the <headers> section
- in the XML-descriptor:
- <headers>
- none
- </headers>
-
-show-retval
Show the symbol's return type in the report.
@@ -1255,7 +1223,6 @@
my $CPP_HEADERS = 0;
my $CheckHeadersOnly = $CheckHeadersOnly_Opt;
-my $CheckObjectsOnly = $CheckObjectsOnly_Opt;
my $TargetComponent;
@@ -1832,29 +1799,27 @@
}
}
- if(not $CheckObjectsOnly_Opt)
- {
- my $DHeaders = parseTag(\$Content, "headers");
- if(not $DHeaders) {
- exitStatus("Error", "header files in the $DName are not specified (<headers> section)");
+ my $DHeaders = parseTag(\$Content, "headers");
+ if(not $DHeaders) {
+ exitStatus("Error", "header files in the $DName are not specified (<headers> section)");
+ }
+ elsif(lc($DHeaders) ne "none")
+ { # append the descriptor headers list
+ if($Descriptor{$LibVersion}{"Headers"})
+ { # multiple descriptors
+ $Descriptor{$LibVersion}{"Headers"} .= "\n".$DHeaders;
}
- elsif(lc($DHeaders) ne "none")
- { # append the descriptor headers list
- if($Descriptor{$LibVersion}{"Headers"})
- { # multiple descriptors
- $Descriptor{$LibVersion}{"Headers"} .= "\n".$DHeaders;
- }
- else {
- $Descriptor{$LibVersion}{"Headers"} = $DHeaders;
- }
- foreach my $Path (split(/\s*\n\s*/, $DHeaders))
- {
- if(not -e $Path) {
- exitStatus("Access_Error", "can't access \'$Path\'");
- }
+ else {
+ $Descriptor{$LibVersion}{"Headers"} = $DHeaders;
+ }
+ foreach my $Path (split(/\s*\n\s*/, $DHeaders))
+ {
+ if(not -e $Path) {
+ exitStatus("Access_Error", "can't access \'$Path\'");
}
}
}
+
if(not $CheckHeadersOnly_Opt)
{
my $DObjects = parseTag(\$Content, "libs");
@@ -7401,40 +7366,6 @@
}
}
-sub get_SignatureNoInfo($$)
-{
- my ($Symbol, $LibVersion) = @_;
- if($Cache{"get_SignatureNoInfo"}{$LibVersion}{$Symbol}) {
- return $Cache{"get_SignatureNoInfo"}{$LibVersion}{$Symbol};
- }
- my ($MnglName, $VersionSpec, $SymbolVersion) = separate_symbol($Symbol);
- my $Signature = $tr_name{$MnglName}?$tr_name{$MnglName}:$MnglName;
- if($Symbol=~/\A(_Z|\?)/)
- { # C++
- # some standard typedefs
- $Signature=~s/\Qstd::basic_string<char, std::char_traits<char>, std::allocator<char> >\E/std::string/g;
- $Signature=~s/\Qstd::map<std::string, std::string, std::less<std::string >, std::allocator<std::pair<std::string const, std::string > > >\E/std::map<std::string, std::string>/g;
- }
- if(not $CheckObjectsOnly or $OSgroup=~/linux|bsd|beos/i)
- { # ELF format marks data as OBJECT
- if($GlobalDataObject{$LibVersion}{$Symbol}) {
- $Signature .= " [data]";
- }
- elsif($Symbol!~/\A(_Z|\?)/) {
- $Signature .= " (...)";
- }
- }
- if(my $ChargeLevel = get_ChargeLevel($Symbol, $LibVersion))
- {
- my $ShortName = substr($Signature, 0, find_center($Signature, "("));
- $Signature=~s/\A\Q$ShortName\E/$ShortName $ChargeLevel/g;
- }
- if($SymbolVersion) {
- $Signature .= $VersionSpec.$SymbolVersion;
- }
- return ($Cache{"get_SignatureNoInfo"}{$LibVersion}{$Symbol} = $Signature);
-}
-
sub get_ChargeLevel($$)
{
my ($Symbol, $LibVersion) = @_;
@@ -7503,11 +7434,8 @@
return $Cache{"get_Signature"}{$LibVersion}{$Symbol};
}
my ($MnglName, $VersionSpec, $SymbolVersion) = separate_symbol($Symbol);
- if(isPrivateData($MnglName) or not $CompleteSignature{$LibVersion}{$Symbol}{"Header"})
- { # non-public global data
- return get_SignatureNoInfo($Symbol, $LibVersion);
- }
my ($Signature, @Param_Types_FromUnmangledName) = ();
+
my $ShortName = $CompleteSignature{$LibVersion}{$Symbol}{"ShortName"};
if($Symbol=~/\A(_Z|\?)/)
{
@@ -9180,7 +9108,7 @@
if(not keys(%{$SymbolInfo{$LibVersion}}))
{ # check if input is valid
- if(not $ExtendedCheck and not $CheckObjectsOnly)
+ if(not $ExtendedCheck)
{
if($CheckHeadersOnly) {
exitStatus("Empty_Set", "the set of public symbols is empty (".$Descriptor{$LibVersion}{"Version"}.")");
@@ -9716,7 +9644,7 @@
elsif($Level eq "Source")
{ # checked
if($SInfo->{"PureVirt"} or $SInfo->{"Data"} or $SInfo->{"InLine"}
- or isInLineInst($Symbol, $SInfo, $LibVersion))
+ or isInLineInst($SInfo, $LibVersion))
{ # skip LOCAL symbols
if($Target) {
return 1;
@@ -12391,57 +12319,37 @@
return ($Symbol=~/\A(_ZGV|_ZTI|_ZTS|_ZTT|_ZTV|_ZTC|_ZThn|_ZTv0_n)/);
}
-sub isInLineInst($$$) {
+sub isInLineInst($$) {
return (isTemplateInstance(@_) and not isTemplateSpec(@_));
}
-sub isTemplateInstance($$$)
+sub isTemplateInstance($$)
{
- my ($Symbol, $SInfo, $LibVersion) = @_;
- if($CheckObjectsOnly)
+ my ($SInfo, $LibVersion) = @_;
+
+ if(my $ClassId = $SInfo->{"Class"})
{
- if($Symbol!~/\A(_Z|\?)/) {
- return 0;
- }
- if(my $Signature = $tr_name{$Symbol})
+ if(my $ClassName = $TypeInfo{$LibVersion}{$ClassId}{"Name"})
{
- if(index($Signature,">")==-1) {
- return 0;
- }
- if(my $ShortName = substr($Signature, 0, find_center($Signature, "(")))
- {
- if(index($ShortName,"<")!=-1
- and index($ShortName,">")!=-1) {
- return 1;
- }
- }
- }
- }
- else
- {
- if(my $ClassId = $SInfo->{"Class"})
- {
- if(my $ClassName = $TypeInfo{$LibVersion}{$ClassId}{"Name"})
- {
- if(index($ClassName,"<")!=-1) {
- return 1;
- }
- }
- }
- if(my $ShortName = $SInfo->{"ShortName"})
- {
- if(index($ShortName,"<")!=-1
- and index($ShortName,">")!=-1) {
+ if(index($ClassName,"<")!=-1) {
return 1;
}
}
}
+ if(my $ShortName = $SInfo->{"ShortName"})
+ {
+ if(index($ShortName,"<")!=-1
+ and index($ShortName,">")!=-1) {
+ return 1;
+ }
+ }
+
return 0;
}
-sub isTemplateSpec($$$)
+sub isTemplateSpec($$)
{
- my ($Symbol, $SInfo, $LibVersion) = @_;
+ my ($SInfo, $LibVersion) = @_;
if(my $ClassId = $SInfo->{"Class"})
{
if($TypeInfo{$LibVersion}{$ClassId}{"Spec"})
@@ -12459,6 +12367,7 @@
sub symbolFilter($$$$)
{ # some special cases when the symbol cannot be imported
my ($Symbol, $LibVersion, $Type, $Level) = @_;
+
if(isPrivateData($Symbol))
{ # non-public global data
return 0;
@@ -12469,9 +12378,6 @@
return 0 if($Symbol=~/($SkipInternal)/);
}
- if($CheckObjectsOnly) {
- return 0 if($Symbol=~/\A(_init|_fini)\Z/);
- }
if($CheckHeadersOnly and not checkDump($LibVersion, "2.7"))
{ # support for old ABI dumps in --headers-only mode
foreach my $Pos (keys(%{$CompleteSignature{$LibVersion}{$Symbol}{"Param"}}))
@@ -12487,14 +12393,22 @@
}
if($Type=~/Affected/)
{
+ my $Header = $CompleteSignature{$LibVersion}{$Symbol}{"Header"};
+
if($SkipSymbols{$LibVersion}{$Symbol})
{ # user defined symbols to ignore
return 0;
}
+
if($SymbolsListPath and not $SymbolsList{$Symbol})
{ # user defined symbols
- return 0;
+ if(not $TargetHeadersPath or not $Header
+ or not is_target_header($Header, 1))
+ { # -symbols-list | -headers-list
+ return 0;
+ }
}
+
if($AppPath and not $SymbolsList_App{$Symbol})
{ # user defined symbols (in application)
return 0;
@@ -12519,7 +12433,7 @@
}
}
}
- if(my $Header = $CompleteSignature{$LibVersion}{$Symbol}{"Header"})
+ if($Header)
{
if(my $Skip = skipHeader($Header, $LibVersion))
{ # --skip-headers or <skip_headers> (not <skip_including>)
@@ -12565,43 +12479,34 @@
}
if($Level eq "Binary")
{
- if($CheckObjectsOnly)
+ if($CompleteSignature{$LibVersion}{$Symbol}{"InLine"}
+ or isInLineInst($CompleteSignature{$LibVersion}{$Symbol}, $LibVersion))
{
- if(isTemplateInstance($Symbol, $CompleteSignature{$LibVersion}{$Symbol}, $LibVersion)) {
- return 0;
- }
- }
- else
- {
- if($CompleteSignature{$LibVersion}{$Symbol}{"InLine"}
- or isInLineInst($Symbol, $CompleteSignature{$LibVersion}{$Symbol}, $LibVersion))
- {
- if($ClassId and $CompleteSignature{$LibVersion}{$Symbol}{"Virt"})
- { # inline virtual methods
- if($Type=~/InlineVirt/) {
- return 1;
- }
- my $Allocable = (not isCopyingClass($ClassId, $LibVersion));
- if(not $Allocable)
- { # check bases
- foreach my $DCId (get_sub_classes($ClassId, $LibVersion, 1))
- {
- if(not isCopyingClass($DCId, $LibVersion))
- { # exists a derived class without default c-tor
- $Allocable=1;
- last;
- }
+ if($ClassId and $CompleteSignature{$LibVersion}{$Symbol}{"Virt"})
+ { # inline virtual methods
+ if($Type=~/InlineVirt/) {
+ return 1;
+ }
+ my $Allocable = (not isCopyingClass($ClassId, $LibVersion));
+ if(not $Allocable)
+ { # check bases
+ foreach my $DCId (get_sub_classes($ClassId, $LibVersion, 1))
+ {
+ if(not isCopyingClass($DCId, $LibVersion))
+ { # exists a derived class without default c-tor
+ $Allocable=1;
+ last;
}
}
- if(not $Allocable) {
- return 0;
- }
}
- else
- { # inline non-virtual methods
+ if(not $Allocable) {
return 0;
}
}
+ else
+ { # inline non-virtual methods
+ return 0;
+ }
}
}
}
@@ -12632,9 +12537,6 @@
my $Level = $_[0];
foreach my $Symbol (keys(%{$Symbol_Library{1}}))
{
- if($CheckObjectsOnly) {
- $CheckedSymbols{"Binary"}{$Symbol} = 1;
- }
if(link_symbol($Symbol, 2, "+Deps"))
{ # linker can find an old symbol
# in the new-version library
@@ -12654,14 +12556,14 @@
foreach my $Symbol (sort keys(%{$AddedInt{$Level}}))
{ # checking added symbols
next if($CompleteSignature{2}{$Symbol}{"Private"});
- next if(not $CompleteSignature{2}{$Symbol}{"Header"} and not $CheckObjectsOnly);
+ next if(not $CompleteSignature{2}{$Symbol}{"Header"});
next if(not symbolFilter($Symbol, 2, "Affected + InlineVirt", $Level));
%{$CompatProblems{$Level}{$Symbol}{"Added_Symbol"}{""}}=();
}
foreach my $Symbol (sort keys(%{$RemovedInt{$Level}}))
{ # checking removed symbols
next if($CompleteSignature{1}{$Symbol}{"Private"});
- next if(not $CompleteSignature{1}{$Symbol}{"Header"} and not $CheckObjectsOnly);
+ next if(not $CompleteSignature{1}{$Symbol}{"Header"});
if(index($Symbol, "_ZTV")==0)
{ # skip v-tables for templates, that should not be imported by applications
next if($tr_name{$Symbol}=~/</);
@@ -15006,9 +14908,6 @@
{
my ($FullSignature, $Param_Pos, $ItalicParams, $ColorParams, $ShowReturn) = @_;
$Param_Pos = "" if(not defined $Param_Pos);
- if($CheckObjectsOnly) {
- $ItalicParams=$ColorParams=0;
- }
my ($Signature, $VersionSpec, $SymbolVersion) = separate_symbol($FullSignature);
my $Return = "";
if($ShowRetVal and $Signature=~s/([^:]):([^:].+?)\Z/$1/g) {
@@ -15436,38 +15335,37 @@
sub get_SourceInfo()
{
my ($CheckedHeaders, $CheckedSources, $CheckedLibs) = ("", "");
- if(not $CheckObjectsOnly)
+
+ if(my @Headers = get_CheckedHeaders(1))
{
- if(my @Headers = get_CheckedHeaders(1))
+ $CheckedHeaders = "<a name='Headers'></a><h2>Header Files (".($#Headers+1).")</h2><hr/>\n";
+ $CheckedHeaders .= "<div class='h_list'>\n";
+ foreach my $Header_Path (sort {lc($Registered_Headers{1}{$a}{"Identity"}) cmp lc($Registered_Headers{1}{$b}{"Identity"})} @Headers)
{
- $CheckedHeaders = "<a name='Headers'></a><h2>Header Files (".($#Headers+1).")</h2><hr/>\n";
- $CheckedHeaders .= "<div class='h_list'>\n";
- foreach my $Header_Path (sort {lc($Registered_Headers{1}{$a}{"Identity"}) cmp lc($Registered_Headers{1}{$b}{"Identity"})} @Headers)
- {
- my $Identity = $Registered_Headers{1}{$Header_Path}{"Identity"};
- my $Name = get_filename($Identity);
- my $Comment = ($Identity=~/[\/\\]/)?" ($Identity)":"";
- $CheckedHeaders .= $Name.$Comment."<br/>\n";
- }
- $CheckedHeaders .= "</div>\n";
- $CheckedHeaders .= "<br/>$TOP_REF<br/>\n";
+ my $Identity = $Registered_Headers{1}{$Header_Path}{"Identity"};
+ my $Name = get_filename($Identity);
+ my $Comment = ($Identity=~/[\/\\]/)?" ($Identity)":"";
+ $CheckedHeaders .= $Name.$Comment."<br/>\n";
}
-
- if(my @Sources = keys(%{$Registered_Sources{1}}))
- {
- $CheckedSources = "<a name='Sources'></a><h2>Source Files (".($#Sources+1).")</h2><hr/>\n";
- $CheckedSources .= "<div class='h_list'>\n";
- foreach my $Header_Path (sort {lc($Registered_Sources{1}{$a}{"Identity"}) cmp lc($Registered_Sources{1}{$b}{"Identity"})} @Sources)
- {
- my $Identity = $Registered_Sources{1}{$Header_Path}{"Identity"};
- my $Name = get_filename($Identity);
- my $Comment = ($Identity=~/[\/\\]/)?" ($Identity)":"";
- $CheckedSources .= $Name.$Comment."<br/>\n";
- }
- $CheckedSources .= "</div>\n";
- $CheckedSources .= "<br/>$TOP_REF<br/>\n";
- }
+ $CheckedHeaders .= "</div>\n";
+ $CheckedHeaders .= "<br/>$TOP_REF<br/>\n";
}
+
+ if(my @Sources = keys(%{$Registered_Sources{1}}))
+ {
+ $CheckedSources = "<a name='Sources'></a><h2>Source Files (".($#Sources+1).")</h2><hr/>\n";
+ $CheckedSources .= "<div class='h_list'>\n";
+ foreach my $Header_Path (sort {lc($Registered_Sources{1}{$a}{"Identity"}) cmp lc($Registered_Sources{1}{$b}{"Identity"})} @Sources)
+ {
+ my $Identity = $Registered_Sources{1}{$Header_Path}{"Identity"};
+ my $Name = get_filename($Identity);
+ my $Comment = ($Identity=~/[\/\\]/)?" ($Identity)":"";
+ $CheckedSources .= $Name.$Comment."<br/>\n";
+ }
+ $CheckedSources .= "</div>\n";
+ $CheckedSources .= "<br/>$TOP_REF<br/>\n";
+ }
+
if(not $CheckHeadersOnly)
{
$CheckedLibs = "<a name='Libs'></a><h2>".get_ObjTitle()." (".keys(%{$Library_Symbol{1}}).")</h2><hr/>\n";
@@ -15480,6 +15378,7 @@
$CheckedLibs .= "</div>\n";
$CheckedLibs .= "<br/>$TOP_REF<br/>\n";
}
+
return $CheckedHeaders.$CheckedSources.$CheckedLibs;
}
@@ -15662,33 +15561,28 @@
%TypeChanges = (); # free memory
- if($CheckObjectsOnly)
- { # only removed exported symbols
- $RESULT{$Level}{"Affected"} = $Removed*100/keys(%{$Symbol_Library{1}});
+ # changed and removed public symbols
+ my $SCount = keys(%{$CheckedSymbols{$Level}});
+ if($ExtendedCheck)
+ { # don't count external_func_0 for constants
+ $SCount-=1;
}
- else
- { # changed and removed public symbols
- my $SCount = keys(%{$CheckedSymbols{$Level}});
- if($ExtendedCheck)
- { # don't count external_func_0 for constants
- $SCount-=1;
+ if($SCount)
+ {
+ my %Weight = (
+ "High" => 100,
+ "Medium" => 50,
+ "Low" => 25
+ );
+ foreach (keys(%{$TotalAffected{$Level}})) {
+ $RESULT{$Level}{"Affected"}+=$Weight{$TotalAffected{$Level}{$_}};
}
- if($SCount)
- {
- my %Weight = (
- "High" => 100,
- "Medium" => 50,
- "Low" => 25
- );
- foreach (keys(%{$TotalAffected{$Level}})) {
- $RESULT{$Level}{"Affected"}+=$Weight{$TotalAffected{$Level}{$_}};
- }
- $RESULT{$Level}{"Affected"} = $RESULT{$Level}{"Affected"}/$SCount;
- }
- else {
- $RESULT{$Level}{"Affected"} = 0;
- }
+ $RESULT{$Level}{"Affected"} = $RESULT{$Level}{"Affected"}/$SCount;
}
+ else {
+ $RESULT{$Level}{"Affected"} = 0;
+ }
+
$RESULT{$Level}{"Affected"} = show_number($RESULT{$Level}{"Affected"});
if($RESULT{$Level}{"Affected"}>=100) {
$RESULT{$Level}{"Affected"} = 100;
@@ -15896,9 +15790,6 @@
my $Headers_Link = "<a href='#Headers' style='color:Blue;'>".($#Headers + 1)."</a>";
$TestResults .= "<tr><th>Total Header Files</th><td>".$Headers_Link."</td></tr>\n";
}
- elsif($CheckObjectsOnly) {
- $TestResults .= "<tr><th>Total Header Files</th><td>0 (not analyzed)</td></tr>\n";
- }
if(my @Sources = keys(%{$Registered_Sources{1}}))
{
@@ -15964,39 +15855,33 @@
my $TH_Link = "0";
$TH_Link = "<a href='#".get_Anchor("Type", $Level, "High")."' style='color:Blue;'>$T_Problems_High</a>" if($T_Problems_High>0);
- $TH_Link = "n/a" if($CheckObjectsOnly);
$META_DATA .= "type_problems_high:$T_Problems_High;";
$Problem_Summary .= "<tr><th rowspan='3'>Problems with<br/>Data Types</th>";
$Problem_Summary .= "<td>High</td><td".getStyle("T", "H", $T_Problems_High).">$TH_Link</td></tr>\n";
my $TM_Link = "0";
$TM_Link = "<a href='#".get_Anchor("Type", $Level, "Medium")."' style='color:Blue;'>$T_Problems_Medium</a>" if($T_Problems_Medium>0);
- $TM_Link = "n/a" if($CheckObjectsOnly);
$META_DATA .= "type_problems_medium:$T_Problems_Medium;";
$Problem_Summary .= "<tr><td>Medium</td><td".getStyle("T", "M", $T_Problems_Medium).">$TM_Link</td></tr>\n";
my $TL_Link = "0";
$TL_Link = "<a href='#".get_Anchor("Type", $Level, "Low")."' style='color:Blue;'>$T_Problems_Low</a>" if($T_Problems_Low>0);
- $TL_Link = "n/a" if($CheckObjectsOnly);
$META_DATA .= "type_problems_low:$T_Problems_Low;";
$Problem_Summary .= "<tr><td>Low</td><td".getStyle("T", "L", $T_Problems_Low).">$TL_Link</td></tr>\n";
my $IH_Link = "0";
$IH_Link = "<a href='#".get_Anchor("Symbol", $Level, "High")."' style='color:Blue;'>$I_Problems_High</a>" if($I_Problems_High>0);
- $IH_Link = "n/a" if($CheckObjectsOnly);
$META_DATA .= "interface_problems_high:$I_Problems_High;";
$Problem_Summary .= "<tr><th rowspan='3'>Problems with<br/>Symbols</th>";
$Problem_Summary .= "<td>High</td><td".getStyle("I", "H", $I_Problems_High).">$IH_Link</td></tr>\n";
my $IM_Link = "0";
$IM_Link = "<a href='#".get_Anchor("Symbol", $Level, "Medium")."' style='color:Blue;'>$I_Problems_Medium</a>" if($I_Problems_Medium>0);
- $IM_Link = "n/a" if($CheckObjectsOnly);
$META_DATA .= "interface_problems_medium:$I_Problems_Medium;";
$Problem_Summary .= "<tr><td>Medium</td><td".getStyle("I", "M", $I_Problems_Medium).">$IM_Link</td></tr>\n";
my $IL_Link = "0";
$IL_Link = "<a href='#".get_Anchor("Symbol", $Level, "Low")."' style='color:Blue;'>$I_Problems_Low</a>" if($I_Problems_Low>0);
- $IL_Link = "n/a" if($CheckObjectsOnly);
$META_DATA .= "interface_problems_low:$I_Problems_Low;";
$Problem_Summary .= "<tr><td>Low</td><td".getStyle("I", "L", $I_Problems_Low).">$IL_Link</td></tr>\n";
@@ -16004,24 +15889,23 @@
if(keys(%{$CheckedSymbols{$Level}}) and $C_Problems_Low) {
$ChangedConstants_Link = "<a href='#".get_Anchor("Constant", $Level, "Low")."' style='color:Blue;'>$C_Problems_Low</a>";
}
- $ChangedConstants_Link = "n/a" if($CheckObjectsOnly);
$META_DATA .= "changed_constants:$C_Problems_Low;";
$Problem_Summary .= "<tr><th>Problems with<br/>Constants</th><td>Low</td><td".getStyle("C", "L", $C_Problems_Low).">$ChangedConstants_Link</td></tr>\n";
# Safe Changes
- if($T_Other and not $CheckObjectsOnly)
+ if($T_Other)
{
my $TS_Link = "<a href='#".get_Anchor("Type", $Level, "Safe")."' style='color:Blue;'>$T_Other</a>";
$Problem_Summary .= "<tr><th>Other Changes<br/>in Data Types</th><td>-</td><td".getStyle("T", "S", $T_Other).">$TS_Link</td></tr>\n";
}
- if($I_Other and not $CheckObjectsOnly)
+ if($I_Other)
{
my $IS_Link = "<a href='#".get_Anchor("Symbol", $Level, "Safe")."' style='color:Blue;'>$I_Other</a>";
$Problem_Summary .= "<tr><th>Other Changes<br/>in Symbols</th><td>-</td><td".getStyle("I", "S", $I_Other).">$IS_Link</td></tr>\n";
}
- if($C_Other and not $CheckObjectsOnly)
+ if($C_Other)
{
my $CS_Link = "<a href='#".get_Anchor("Constant", $Level, "Safe")."' style='color:Blue;'>$C_Other</a>";
$Problem_Summary .= "<tr><th>Other Changes<br/>in Constants</th><td>-</td><td".getStyle("C", "S", $C_Other).">$CS_Link</td></tr>\n";
@@ -17137,8 +17021,9 @@
foreach my $Symbol (sort {lc($a) cmp lc($b)} keys(%SymSel))
{
+ my $Loc = $SymSel{$Symbol}{"Loc"};
my $PName = getParamName($Loc);
- my $Desc = getAffectDesc($Level, $Symbol, $SymSel{$Symbol}{"Kind"}, $SymSel{$Symbol}{"Loc"});
+ my $Desc = getAffectDesc($Level, $Symbol, $SymSel{$Symbol}{"Kind"}, $Loc);
my $Target = "";
if($PName)
@@ -18870,10 +18755,6 @@
setLanguage($LibVersion, "C++");
}
}
- if($CheckObjectsOnly
- and $LibVersion==1) {
- $CheckedSymbols{"Binary"}{$Symbol} = 1;
- }
}
}
}
@@ -18946,10 +18827,6 @@
setLanguage($LibVersion, "C++");
}
}
- if($CheckObjectsOnly
- and $LibVersion==1) {
- $CheckedSymbols{"Binary"}{$realname} = 1;
- }
}
}
}
@@ -19062,10 +18939,6 @@
setLanguage($LibVersion, "C++");
}
}
- if($CheckObjectsOnly
- and $LibVersion==1) {
- $CheckedSymbols{"Binary"}{$Symbol} = 1;
- }
}
}
}
@@ -19200,13 +19073,10 @@
}
}
- if(not $CheckObjectsOnly)
- {
- # search for headers in /usr/lib
- my @Headers = grep { /\.h(pp|xx)?\Z|\/include\// } @Files;
- @Headers = grep { not /\/(gcc|jvm|syslinux|kbd|parrot|xemacs|perl|llvm)/ } @Headers;
- push(@SysHeaders, @Headers);
- }
+ # search for headers in /usr/lib
+ my @Headers = grep { /\.h(pp|xx)?\Z|\/include\// } @Files;
+ @Headers = grep { not /\/(gcc|jvm|syslinux|kbd|parrot|xemacs|perl|llvm)/ } @Headers;
+ push(@SysHeaders, @Headers);
# search for libraries in /usr/lib (including symbolic links)
my @Libs = grep { /\.$LIB_EXT[0-9.]*\Z/ } @Files;
@@ -19218,23 +19088,20 @@
}
}
- if(not $CheckObjectsOnly)
+ foreach my $DevelPath (@{$SystemPaths{"include"}})
{
- foreach my $DevelPath (@{$SystemPaths{"include"}})
- {
- next if(not -d $DevelPath);
- # search for all header files in the /usr/include
- # with or without extension (ncurses.h, QtCore, ...)
- push(@SysHeaders, cmd_find($DevelPath,"f"));
- foreach my $Link (cmd_find($DevelPath,"l"))
- { # add symbolic links
- if(-f $Link) {
- push(@SysHeaders, $Link);
- }
+ next if(not -d $DevelPath);
+ # search for all header files in the /usr/include
+ # with or without extension (ncurses.h, QtCore, ...)
+ push(@SysHeaders, cmd_find($DevelPath,"f"));
+ foreach my $Link (cmd_find($DevelPath,"l"))
+ { # add symbolic links
+ if(-f $Link) {
+ push(@SysHeaders, $Link);
}
}
- get_prefixes_I(\@SysHeaders, \%SystemHeaders);
}
+ get_prefixes_I(\@SysHeaders, \%SystemHeaders);
}
sub getSOPaths($)
@@ -20473,6 +20340,16 @@
}
elsif(is_header($Path, 2, $LibVersion))
{ # header file
+ $CheckHeadersOnly = 1;
+
+ if($LibVersion==1) {
+ $TargetVersion{$LibVersion} = "X";
+ }
+
+ if($LibVersion==2) {
+ $TargetVersion{$LibVersion} = "Y";
+ }
+
return "
<version>
".$TargetVersion{$LibVersion}."
@@ -20486,21 +20363,6 @@
none
</libs>";
}
- elsif(parse_libname($Path, "name", $OStarget))
- { # shared object
- return "
- <version>
- ".$TargetVersion{$LibVersion}."
- </version>
-
- <headers>
- none
- </headers>
-
- <libs>
- $Path
- </libs>";
- }
else
{ # standard XML-descriptor
return readFile($Path);
@@ -20587,7 +20449,6 @@
sub detect_inc_default_paths()
{
- return () if(not $GCC_PATH);
my %DPaths = ("Cpp"=>[],"Gcc"=>[],"Inc"=>[]);
writeFile("$TMP_DIR/empty.h", "");
foreach my $Line (split(/\n/, `$GCC_PATH -v -x c++ -E \"$TMP_DIR/empty.h\" 2>&1`))
@@ -20796,51 +20657,49 @@
exitStatus("Not_Found", "can't find GCC>=3.0 in PATH");
}
- if(not $CheckObjectsOnly_Opt)
+ if(my $GCC_Ver = get_dumpversion($GCC_PATH))
{
- if(my $GCC_Ver = get_dumpversion($GCC_PATH))
+ my $GccTarget = get_dumpmachine($GCC_PATH);
+
+ if($GccTarget=~/linux/)
{
- my $GccTarget = get_dumpmachine($GCC_PATH);
- printMsg("INFO", "Using GCC $GCC_Ver ($GccTarget, target: ".getArch_GCC(1).")");
-
- if($GccTarget=~/linux/)
- {
- $OStarget = "linux";
- $LIB_EXT = $OS_LibExt{$LIB_TYPE}{$OStarget};
- }
- elsif($GccTarget=~/symbian/)
- {
- $OStarget = "symbian";
- $LIB_EXT = $OS_LibExt{$LIB_TYPE}{$OStarget};
- }
-
- # check GCC version
- if($GCC_Ver=~/\A4\.8(|\.[012])\Z/)
- { # bug http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57850
- # introduced in 4.8
- # fixed in 4.8.3
- printMsg("WARNING", "Not working properly with GCC $GCC_Ver. Please update or downgrade GCC or use a local installation by --gcc-path=PATH option.");
- $EMERGENCY_MODE_48 = 1;
- }
+ $OStarget = "linux";
+ $LIB_EXT = $OS_LibExt{$LIB_TYPE}{$OStarget};
}
- else {
- exitStatus("Error", "something is going wrong with the GCC compiler");
+ elsif($GccTarget=~/symbian/)
+ {
+ $OStarget = "symbian";
+ $LIB_EXT = $OS_LibExt{$LIB_TYPE}{$OStarget};
+ }
+
+ printMsg("INFO", "Using GCC $GCC_Ver ($GccTarget, target: ".getArch_GCC(1).")");
+
+ # check GCC version
+ if($GCC_Ver=~/\A4\.8(|\.[012])\Z/)
+ { # bug http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57850
+ # introduced in 4.8
+ # fixed in 4.8.3
+ printMsg("WARNING", "Not working properly with GCC $GCC_Ver. Please update or downgrade GCC or use a local installation by --gcc-path=PATH option.");
+ $EMERGENCY_MODE_48 = 1;
}
}
- if($HSearch)
- {
- if(not $NoStdInc)
- { # do NOT search in GCC standard paths
- my %DPaths = detect_inc_default_paths();
- @DefaultCppPaths = @{$DPaths{"Cpp"}};
- @DefaultGccPaths = @{$DPaths{"Gcc"}};
- @DefaultIncPaths = @{$DPaths{"Inc"}};
- push_U($SystemPaths{"include"}, @DefaultIncPaths);
- }
+ else {
+ exitStatus("Error", "something is going wrong with the GCC compiler");
}
}
if($HSearch)
- { # users include paths
+ {
+ # GCC standard paths
+ if($GCC_PATH and not $NoStdInc)
+ {
+ my %DPaths = detect_inc_default_paths();
+ @DefaultCppPaths = @{$DPaths{"Cpp"}};
+ @DefaultGccPaths = @{$DPaths{"Gcc"}};
+ @DefaultIncPaths = @{$DPaths{"Inc"}};
+ push_U($SystemPaths{"include"}, @DefaultIncPaths);
+ }
+
+ # users include paths
my $IncPath = "/usr/include";
if($SystemRoot) {
$IncPath = $SystemRoot.$IncPath;
@@ -21123,12 +20982,13 @@
sub createSymbolsList($$$$$)
{
my ($DPath, $SaveTo, $LName, $LVersion, $ArchName) = @_;
+
read_ABI_Dump(1, $DPath);
- if(not $CheckObjectsOnly) {
- prepareSymbols(1);
- }
+ prepareSymbols(1);
+
my %SymbolHeaderLib = ();
my $Total = 0;
+
# Get List
foreach my $Symbol (sort keys(%{$CompleteSignature{1}}))
{
@@ -21256,69 +21116,6 @@
return 0;
}
-sub checkVersionNum($$)
-{
- my ($LibVersion, $Path) = @_;
- if(my $VerNum = $TargetVersion{$LibVersion}) {
- return $VerNum;
- }
- my $UsedAltDescr = 0;
- foreach my $Part (split(/\s*,\s*/, $Path))
- { # try to get version string from file path
- next if(isDump($Part)); # ABI dump
- next if($Part=~/\.(xml|desc)\Z/i); # XML descriptor
- my $VerNum = "";
- if(parse_libname($Part, "name", $OStarget))
- {
- $UsedAltDescr = 1;
- $VerNum = parse_libname($Part, "version", $OStarget);
- if(not $VerNum) {
- $VerNum = readStrVer($Part);
- }
- }
- elsif(is_header($Part, 2, $LibVersion) or -d $Part)
- {
- $UsedAltDescr = 1;
- $VerNum = readStrVer($Part);
- }
- if($VerNum ne "")
- {
- $TargetVersion{$LibVersion} = $VerNum;
- if($DumpAPI) {
- printMsg("WARNING", "setting version number to $VerNum (use -vnum option to change it)");
- }
- else {
- printMsg("WARNING", "setting ".($LibVersion==1?"1st":"2nd")." version number to \"$VerNum\" (use -v$LibVersion option to change it)");
- }
- return $TargetVersion{$LibVersion};
- }
- }
- if($UsedAltDescr)
- {
- if($DumpAPI) {
- exitStatus("Error", "version number is not set (use -vnum option)");
- }
- else {
- exitStatus("Error", ($LibVersion==1?"1st":"2nd")." version number is not set (use -v$LibVersion option)");
- }
- }
-}
-
-sub readStrVer($)
-{
- my $Str = $_[0];
- return "" if(not $Str);
- $Str=~s/\Q$TargetLibraryName\E//g;
- if($Str=~/(\/|\\|\w|\A)[\-\_]*(\d+[\d\.\-]+\d+|\d+)/)
- { # .../libssh-0.4.0/...
- return $2;
- }
- elsif(my $V = parse_libname($Str, "version", $OStarget)) {
- return $V;
- }
- return "";
-}
-
sub readLibs($)
{
my $LibVersion = $_[0];
@@ -21623,27 +21420,16 @@
exitStatus("Access_Error", "can't access \'$DumpAPI\'");
}
- my @DParts = split(/\s*,\s*/, $DumpAPI);
- foreach my $Part (@DParts)
- {
- if(not -e $Part) {
- exitStatus("Access_Error", "can't access \'$Part\'");
- }
+ if(isDump($DumpAPI)) {
+ read_ABI_Dump(1, $DumpAPI);
}
- checkVersionNum(1, $DumpAPI);
- foreach my $Part (@DParts)
- {
- if(isDump($Part)) {
- read_ABI_Dump(1, $Part);
- }
- else {
- readDescriptor(1, createDescriptor(1, $Part));
- }
+ else {
+ readDescriptor(1, createDescriptor(1, $DumpAPI));
}
if(not $Descriptor{1}{"Version"})
- { # set to default: X
- $Descriptor{1}{"Version"} = "X";
+ { # set to default: N
+ $Descriptor{1}{"Version"} = "N";
}
initLogging(1);
@@ -21686,9 +21472,7 @@
if($CheckHeadersOnly) {
setLanguage(1, "C++");
}
- if(not $CheckObjectsOnly) {
- searchForHeaders(1);
- }
+ searchForHeaders(1);
$WORD_SIZE{1} = detectWordSize(1);
}
if(not $Descriptor{1}{"Dump"})
@@ -21700,7 +21484,7 @@
cleanDump(1);
if(not keys(%{$SymbolInfo{1}}))
{ # check if created dump is valid
- if(not $ExtendedCheck and not $CheckObjectsOnly)
+ if(not $ExtendedCheck)
{
if($CheckHeadersOnly) {
exitStatus("Empty_Set", "the set of public symbols is empty");
@@ -21989,50 +21773,38 @@
if(not $Descriptor{1}{"Path"}) {
exitStatus("Error", "-old option is not specified");
}
- my @DParts1 = split(/\s*,\s*/, $Descriptor{1}{"Path"});
- foreach my $Part (@DParts1)
- {
- if(not -e $Part) {
- exitStatus("Access_Error", "can't access \'$Part\'");
- }
+ if(not -e $Descriptor{1}{"Path"}) {
+ exitStatus("Access_Error", "can't access \'".$Descriptor{1}{"Path"}."\'");
}
+
if(not $Descriptor{2}{"Path"}) {
exitStatus("Error", "-new option is not specified");
}
- my @DParts2 = split(/\s*,\s*/, $Descriptor{2}{"Path"});
- foreach my $Part (@DParts2)
- {
- if(not -e $Part) {
- exitStatus("Access_Error", "can't access \'$Part\'");
- }
+ if(not -e $Descriptor{2}{"Path"}) {
+ exitStatus("Access_Error", "can't access \'".$Descriptor{2}{"Path"}."\'");
}
+
detect_default_paths("bin"); # to extract dumps
- if($#DParts1==0 and $#DParts2==0
- and isDump($Descriptor{1}{"Path"})
+ if(isDump($Descriptor{1}{"Path"})
and isDump($Descriptor{2}{"Path"}))
{ # optimization: equal ABI dumps
quickEmptyReports();
}
- checkVersionNum(1, $Descriptor{1}{"Path"});
- checkVersionNum(2, $Descriptor{2}{"Path"});
+
printMsg("INFO", "preparation, please wait ...");
- foreach my $Part (@DParts1)
- {
- if(isDump($Part)) {
- read_ABI_Dump(1, $Part);
- }
- else {
- readDescriptor(1, createDescriptor(1, $Part));
- }
+
+ if(isDump($Descriptor{1}{"Path"})) {
+ read_ABI_Dump(1, $Descriptor{1}{"Path"});
}
- foreach my $Part (@DParts2)
- {
- if(isDump($Part)) {
- read_ABI_Dump(2, $Part);
- }
- else {
- readDescriptor(2, createDescriptor(2, $Part));
- }
+ else {
+ readDescriptor(1, createDescriptor(1, $Descriptor{1}{"Path"}));
+ }
+
+ if(isDump($Descriptor{2}{"Path"})) {
+ read_ABI_Dump(2, $Descriptor{2}{"Path"});
+ }
+ else {
+ readDescriptor(2, createDescriptor(2, $Descriptor{2}{"Path"}));
}
if(not $Descriptor{1}{"Version"})
@@ -22047,66 +21819,25 @@
initLogging(1);
initLogging(2);
- # check consistency
- if(not $Descriptor{1}{"Headers"}
- and not $Descriptor{1}{"Libs"}) {
- exitStatus("Error", "descriptor d1 does not contain both header files and libraries info");
+
+ # check input data
+ if(not $Descriptor{1}{"Headers"}) {
+ exitStatus("Error", "can't find header files info in descriptor d1");
}
- if(not $Descriptor{2}{"Headers"}
- and not $Descriptor{2}{"Libs"}) {
- exitStatus("Error", "descriptor d2 does not contain both header files and libraries info");
+ if(not $Descriptor{2}{"Headers"}) {
+ exitStatus("Error", "can't find header files info in descriptor d2");
}
- if($Descriptor{1}{"Headers"} and not $Descriptor{1}{"Libs"}
- and not $Descriptor{2}{"Headers"} and $Descriptor{2}{"Libs"}) {
- exitStatus("Error", "can't compare headers with $SLIB_TYPE libraries");
- }
- elsif(not $Descriptor{1}{"Headers"} and $Descriptor{1}{"Libs"}
- and $Descriptor{2}{"Headers"} and not $Descriptor{2}{"Libs"}) {
- exitStatus("Error", "can't compare $SLIB_TYPE libraries with headers");
- }
- if(not $Descriptor{1}{"Headers"})
+
+ if(not $CheckHeadersOnly)
{
- if($CheckHeadersOnly_Opt) {
- exitStatus("Error", "can't find header files info in descriptor d1");
+ if(not $Descriptor{1}{"Libs"}) {
+ exitStatus("Error", "can't find libraries info in descriptor d1");
+ }
+ if(not $Descriptor{2}{"Libs"}) {
+ exitStatus("Error", "can't find libraries info in descriptor d2");
}
}
- if(not $Descriptor{2}{"Headers"})
- {
- if($CheckHeadersOnly_Opt) {
- exitStatus("Error", "can't find header files info in descriptor d2");
- }
- }
- if(not $Descriptor{1}{"Headers"}
- or not $Descriptor{2}{"Headers"})
- {
- if(not $CheckObjectsOnly_Opt)
- {
- printMsg("WARNING", "comparing $SLIB_TYPE libraries only");
- $CheckObjectsOnly = 1;
- }
- }
- if(not $Descriptor{1}{"Libs"})
- {
- if($CheckObjectsOnly_Opt) {
- exitStatus("Error", "can't find $SLIB_TYPE libraries info in descriptor d1");
- }
- }
- if(not $Descriptor{2}{"Libs"})
- {
- if($CheckObjectsOnly_Opt) {
- exitStatus("Error", "can't find $SLIB_TYPE libraries info in descriptor d2");
- }
- }
- if(not $Descriptor{1}{"Libs"}
- or not $Descriptor{2}{"Libs"})
- { # comparing standalone header files
- # comparing ABI dumps created with --headers-only
- if(not $CheckHeadersOnly_Opt)
- {
- printMsg("WARNING", "checking headers only");
- $CheckHeadersOnly = 1;
- }
- }
+
if($UseDumps)
{ # --use-dumps
# parallel processing
@@ -22162,9 +21893,6 @@
if($CheckHeadersOnly) {
@PARAMS = (@PARAMS, "-headers-only");
}
- if($CheckObjectsOnly) {
- @PARAMS = (@PARAMS, "-objects-only");
- }
if($Debug)
{
@PARAMS = (@PARAMS, "-debug");
@@ -22220,9 +21948,6 @@
if($CheckHeadersOnly) {
@PARAMS = (@PARAMS, "-headers-only");
}
- if($CheckObjectsOnly) {
- @PARAMS = (@PARAMS, "-objects-only");
- }
if($Debug)
{
@PARAMS = (@PARAMS, "-debug");
@@ -22273,9 +21998,6 @@
if($CheckHeadersOnly) {
@CMP_PARAMS = (@CMP_PARAMS, "-headers-only");
}
- if($CheckObjectsOnly) {
- @CMP_PARAMS = (@CMP_PARAMS, "-objects-only");
- }
if($BinaryOnly) {
@CMP_PARAMS = (@CMP_PARAMS, "-binary");
}
@@ -22304,9 +22026,7 @@
if($CheckHeadersOnly) {
setLanguage(1, "C++");
}
- if(not $CheckObjectsOnly) {
- searchForHeaders(1);
- }
+ searchForHeaders(1);
$WORD_SIZE{1} = detectWordSize(1);
}
if(not $Descriptor{2}{"Dump"})
@@ -22317,9 +22037,7 @@
if($CheckHeadersOnly) {
setLanguage(2, "C++");
}
- if(not $CheckObjectsOnly) {
- searchForHeaders(2);
- }
+ searchForHeaders(2);
$WORD_SIZE{2} = detectWordSize(2);
}
if($WORD_SIZE{1} ne $WORD_SIZE{2})
@@ -22353,17 +22071,14 @@
if($AppPath and not keys(%{$Symbol_Library{1}})) {
printMsg("WARNING", "the application ".get_filename($AppPath)." has no symbols imported from the $SLIB_TYPE libraries");
}
- # started to process input data
- if(not $CheckObjectsOnly)
- {
- if($Descriptor{1}{"Headers"}
- and not $Descriptor{1}{"Dump"}) {
- readHeaders(1);
- }
- if($Descriptor{2}{"Headers"}
- and not $Descriptor{2}{"Dump"}) {
- readHeaders(2);
- }
+ # process input data
+ if($Descriptor{1}{"Headers"}
+ and not $Descriptor{1}{"Dump"}) {
+ readHeaders(1);
+ }
+ if($Descriptor{2}{"Headers"}
+ and not $Descriptor{2}{"Dump"}) {
+ readHeaders(2);
}
# clean memory
@@ -22411,14 +22126,17 @@
sub compareAPIs($)
{
my $Level = $_[0];
+
readRules($Level);
loadModule("CallConv");
+
if($Level eq "Binary") {
printMsg("INFO", "comparing ABIs ...");
}
else {
printMsg("INFO", "comparing APIs ...");
}
+
if($CheckHeadersOnly
or $Level eq "Source")
{ # added/removed in headers
@@ -22430,12 +22148,10 @@
detectAdded($Level);
detectRemoved($Level);
}
- if(not $CheckObjectsOnly)
- {
- mergeSymbols($Level);
- if(keys(%{$CheckedSymbols{$Level}})) {
- mergeConstants($Level);
- }
+
+ mergeSymbols($Level);
+ if(keys(%{$CheckedSymbols{$Level}})) {
+ mergeConstants($Level);
}
$Cache{"mergeTypes"} = (); # free memory
@@ -22662,7 +22378,7 @@
detect_default_paths("bin|gcc"); # to compile libs
loadModule("RegTests");
testTool($TestDump, $Debug, $Quiet, $ExtendedCheck, $LogMode, $ReportFormat, $DumpFormat,
- $LIB_EXT, $GCC_PATH, $SortDump, $CheckHeadersOnly, $CheckObjectsOnly);
+ $LIB_EXT, $GCC_PATH, $SortDump, $CheckHeadersOnly);
exit(0);
}
if($DumpSystem)
@@ -22750,9 +22466,7 @@
if(not $TargetTitle) {
$TargetTitle = $TargetLibraryName;
}
- if($CheckHeadersOnly_Opt and $CheckObjectsOnly_Opt) {
- exitStatus("Error", "you can't specify both -headers-only and -objects-only options at the same time");
- }
+
if($SymbolsListPath)
{
if(not -f $SymbolsListPath) {
@@ -22825,6 +22539,8 @@
if(not -f $AppPath) {
exitStatus("Access_Error", "can't access file \'$AppPath\'");
}
+
+ detect_default_paths("bin|gcc");
foreach my $Interface (readSymbols_App($AppPath)) {
$SymbolsList_App{$Interface} = 1;
}