in src/main/abi-symbols/abi-dumper.pl [916:1023]
sub readAltInfo($)
{
my $Path = $_[0];
my $Name = getFilename($Path);
if(not checkCmd($EU_READELF)) {
exitStatus("Not_Found", "can't find \"$EU_READELF\" command");
}
printMsg("INFO", "Reading alternate debug-info");
my $ExtraPath = undef;
# lines info
if($ExtraInfo)
{
$ExtraPath = $ExtraInfo."/alt";
mkpath($ExtraPath);
$ExtraPath .= "/debug_line";
}
if($ExtraPath)
{
system($EU_READELF_L." -N --debug-dump=line \"$Path\" 2>\"$TMP_DIR/error\" >\"$ExtraPath\"");
open(SRC, $ExtraPath);
}
else {
open(SRC, $EU_READELF_L." -N --debug-dump=line \"$Path\" 2>\"$TMP_DIR/error\" |");
}
my $DirTable_Def = undef;
my %DirTable = ();
while(<SRC>)
{
if(defined $AddDirs)
{
if(/Directory table/i)
{
$DirTable_Def = 1;
next;
}
elsif(/File name table/i)
{
$DirTable_Def = undef;
next;
}
if(defined $DirTable_Def)
{
if(/\A\s*(.+?)\Z/) {
$DirTable{keys(%DirTable)+1} = $1;
}
elsif(/\A\s*(\d+)\s+(.+?)\s+\(\d+\)\Z/)
{ # F34
$DirTable{$1} = $2;
}
}
}
my ($Num, $Dir, $File) = ();
if(/(\d+)\s+(\d+)\s+\d+\s+\d+\s+([^ ]+)/) {
($Num, $Dir, $File) = ($1, $2, $3)
}
elsif(/(\d+)\s+([^ ]+)\s+\(\d+\)\,\s+(\d+)/)
{ # F34
($Num, $File, $Dir) = ($1, $2, $3);
}
if($File)
{
chomp($File);
if(defined $AddDirs)
{
if(my $DName = $DirTable{$Dir})
{
$File = $DName."/".$File;
}
}
$SourceFile_Alt{0}{$Num} = $File;
}
}
close(SRC);
# debug info
if($ExtraInfo)
{
$ExtraPath = $ExtraInfo."/alt";
mkpath($ExtraPath);
$ExtraPath .= "/debug_info";
}
my $INFO_fh;
if($ExtraPath)
{
system($EU_READELF_L." -N --debug-dump=info \"$Path\" 2>\"$TMP_DIR/error\" >\"$ExtraPath\"");
open($INFO_fh, $ExtraPath);
}
else {
open($INFO_fh, $EU_READELF_L." -N --debug-dump=info \"$Path\" 2>\"$TMP_DIR/error\" |");
}
readDWARFDump($INFO_fh, 0);
}