aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Ponomarenko <aponomarenko@rosalab.ru>2015-11-01 21:17:59 +0300
committerAndrey Ponomarenko <aponomarenko@rosalab.ru>2015-11-01 21:17:59 +0300
commitff7be61a78c0aa8107732083944544ce7bcdbc8c (patch)
tree5658990e0e3b970fe49a2a88a96cf783c216cfa6
parent1a4c231c4c423a2816a5eb3080dac6d5c00b7db3 (diff)
downloadabi-dumper-ff7be61a78c0aa8107732083944544ce7bcdbc8c.tar.gz
Fixed reading of GNU_IFUNC and TLS symbols. Fixed detection of symbol versions. Fixed detection of symbol headers. Fixed reading of debug_loc section.
-rw-r--r--INSTALL4
-rw-r--r--abi-dumper.pl116
2 files changed, 80 insertions, 40 deletions
diff --git a/INSTALL b/INSTALL
index 4dd573b..628f39f 100644
--- a/INSTALL
+++ b/INSTALL
@@ -6,8 +6,8 @@ All rights reserved.
RELEASE INFORMATION
Project: ABI Dumper
-Version: 0.99.11
-Date: 2015-10-18
+Version: 0.99.12
+Date: 2015-11-01
This file explains how to install and setup environment
diff --git a/abi-dumper.pl b/abi-dumper.pl
index 6bdffc1..8f3354a 100644
--- a/abi-dumper.pl
+++ b/abi-dumper.pl
@@ -1,6 +1,6 @@
#!/usr/bin/perl
###########################################################################
-# ABI Dumper 0.99.11
+# ABI Dumper 0.99.12
# Dump ABI of an ELF object containing DWARF debug info
#
# Copyright (C) 2013-2015 Andrey Ponomarenko's ABI Laboratory
@@ -23,7 +23,7 @@
#
# COMPATIBILITY
# =============
-# ABI Compliance Checker >= 1.99.13
+# ABI Compliance Checker >= 1.99.14
#
#
# This program is free software: you can redistribute it and/or modify
@@ -47,7 +47,7 @@ use Cwd qw(abs_path cwd realpath);
use Storable qw(dclone);
use Data::Dumper;
-my $TOOL_VERSION = "0.99.11";
+my $TOOL_VERSION = "0.99.12";
my $ABI_DUMP_VERSION = "3.2";
my $ORIG_DIR = cwd();
my $TMP_DIR = tempdir(CLEANUP=>1);
@@ -471,6 +471,8 @@ my %ELF_BIND = map {$_=>1} (
my %ELF_TYPE = map {$_=>1} (
"FUNC",
"IFUNC",
+ "GNU_IFUNC",
+ "TLS",
"OBJECT",
"COMMON"
);
@@ -586,7 +588,7 @@ sub read_Symbols($)
}
if(not $AllSymbols)
{ # do nothing with symtab
- next;
+ #next;
}
}
elsif(index($_, "'.symtab'")!=-1)
@@ -626,19 +628,27 @@ sub read_Symbols($)
}
}
}
+ else
+ {
+ $Symbol_Value{$Symbol} = $Value;
+ $Value_Symbol{$Value}{$Symbol} = 1;
+ }
- foreach ($SectionInfo{$Ndx}, "")
+ if(not $symtab)
{
- my $Val = $Value;
-
- $SymbolTable{$_}{$Val}{$Symbol} = 1;
-
- if($Val=~s/\A[0]+//)
+ foreach ($SectionInfo{$Ndx}, "")
{
- if($Val eq "") {
- $Val = "0";
- }
+ my $Val = $Value;
+
$SymbolTable{$_}{$Val}{$Symbol} = 1;
+
+ if($Val=~s/\A[0]+//)
+ {
+ if($Val eq "") {
+ $Val = "0";
+ }
+ $SymbolTable{$_}{$Val}{$Symbol} = 1;
+ }
}
}
}
@@ -650,26 +660,26 @@ sub read_Symbols($)
}
my %Found = ();
- foreach my $Symbol (keys(%{$Library_Symbol{$TargetName}}))
+ foreach my $Symbol (sort keys(%Symbol_Value))
{
next if(index($Symbol,"\@")==-1);
if(my $Value = $Symbol_Value{$Symbol})
{
- foreach my $Symbol_SameValue (keys(%{$Value_Symbol{$Value}}))
+ foreach my $Symbol_SameValue (sort keys(%{$Value_Symbol{$Value}}))
{
if($Symbol_SameValue ne $Symbol
and index($Symbol_SameValue,"\@")==-1)
{
$SymVer{$Symbol_SameValue} = $Symbol;
$Found{$Symbol} = 1;
- last;
+ #last;
}
}
}
}
# default
- foreach my $Symbol (keys(%{$Library_Symbol{$TargetName}}))
+ foreach my $Symbol (sort keys(%Symbol_Value))
{
next if(defined $Found{$Symbol});
next if(index($Symbol,"\@\@")==-1);
@@ -683,7 +693,7 @@ sub read_Symbols($)
}
# non-default
- foreach my $Symbol (keys(%{$Library_Symbol{$TargetName}}))
+ foreach my $Symbol (sort keys(%Symbol_Value))
{
next if(defined $Found{$Symbol});
next if(index($Symbol,"\@")==-1);
@@ -1008,7 +1018,7 @@ sub read_DWARF_Info($)
while(<LOC>)
{
- if(/\[\s*(\w+)\].*\[\s*\w+\]\s*(.+)\Z/) {
+ if(/\A \[\s*(\w+)\].*\[\s*\w+\]\s*(.+)\Z/) {
$DebugLoc{$1} = $2;
}
elsif(/\A \[\s*(\w+)\]/) {
@@ -2332,22 +2342,11 @@ sub complete_ABI()
}
elsif(defined $PublicHeadersPath)
{
- if(not defined $SymbolInfo{$ID}{"Header"}
- or not defined $PublicHeader{getFilename($SymbolInfo{$ID}{"Header"})})
+ if(not selectPublic($Symbol, $ID)
+ and (not defined $SymbolInfo{$ID}{"Alias"} or not selectPublic($SymbolInfo{$ID}{"Alias"}, $ID)))
{
- if($OBJ_LANG eq "C")
- {
- if(not defined $SymbolToHeader{$Symbol})
- {
- delete($SymbolInfo{$ID});
- next;
- }
- }
- else
- {
- delete($SymbolInfo{$ID});
- next;
- }
+ delete($SymbolInfo{$ID});
+ next;
}
}
@@ -2357,6 +2356,34 @@ sub complete_ABI()
}
}
+sub selectPublic($$)
+{
+ my ($Symbol, $ID) = @_;
+
+ if(not defined $SymbolInfo{$ID}{"Header"}
+ or not defined $PublicHeader{getFilename($SymbolInfo{$ID}{"Header"})})
+ {
+ if($OBJ_LANG eq "C")
+ {
+ if(not defined $SymbolToHeader{$Symbol})
+ {
+ return 0;
+ }
+ elsif(defined $SymbolInfo{$ID}{"Header"}
+ and $SymbolInfo{$ID}{"Header"} ne $SymbolToHeader{$Symbol}
+ and not defined $SymbolInfo{$ID}{"Alias"})
+ {
+ return 0;
+ }
+ }
+ else {
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
sub cloneSymbol($$)
{
my ($ID, $Symbol) = @_;
@@ -3589,6 +3616,7 @@ sub getSymbolInfo($)
delete($SInfo{"MnglName"});
$MnglName = $ShortName;
+ # $ShortName = $SInfo{"ShortName"};
}
}
else
@@ -3856,7 +3884,7 @@ sub getSymbolInfo($)
if(not $SInfo{"Header"})
{
- if(defined $SInfo{"Class"})
+ if($SInfo{"Class"})
{ # detect missed header by class
if(defined $TypeInfo{$SInfo{"Class"}}{"Header"}) {
$SInfo{"Header"} = $TypeInfo{$SInfo{"Class"}}{"Header"};
@@ -3869,6 +3897,18 @@ sub getSymbolInfo($)
if(defined $SymbolToHeader{$MnglName}) {
$SInfo{"Header"} = $SymbolToHeader{$MnglName};
}
+ elsif(not $SInfo{"Class"}
+ and defined $SymbolToHeader{$SInfo{"ShortName"}}) {
+ $SInfo{"Header"} = $SymbolToHeader{$SInfo{"ShortName"}};
+ }
+ }
+ elsif($SInfo{"Alias"})
+ {
+ if(defined $SymbolToHeader{$SInfo{"Alias"}}
+ and $SymbolToHeader{$SInfo{"Alias"}} ne $SInfo{"Header"})
+ { # TODO: review this case
+ $SInfo{"Header"} = $SymbolToHeader{$SInfo{"Alias"}};
+ }
}
my $PPos = 0;
@@ -4799,8 +4839,8 @@ sub detectPublicSymbols($)
$PublicHeader{getFilename($File)} = 1;
}
- if(defined $OBJ_LANG and $OBJ_LANG eq "C")
- {
+ #if(defined $OBJ_LANG and $OBJ_LANG eq "C")
+ #{
foreach my $File (@Headers)
{
my $HName = getFilename($File);
@@ -4818,7 +4858,7 @@ sub detectPublicSymbols($)
}
}
}
- }
+ #}
$PublicSymbols_Detected = 1;
}