blob: 3a0a07b1c1ef74a305b4f9d91fc2059d3afdd51d [file] [log] [blame]
#!/usr/bin/perl
#
# Copyright Statement:
# --------------------
# This software is protected by Copyright and the information contained
# herein is confidential. The software may not be copied and the information
# contained herein may not be used or disclosed except with the written
# permission of MediaTek Inc. (C) 2006
#
# BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
# THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
# RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
# AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
# NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
# SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
# SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
# THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
# NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
# SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
#
# BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
# LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
# AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
# OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
# MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
#
# THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
# WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
# LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
# RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
# THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
#
#*****************************************************************************
#*
#* Filename:
#* ---------
#* BasicMemInfoQuery.pm
#*
#* Project:
#* --------
#*
#*
#* Description:
#* ------------
#* This perl module is used to collect information from map file
#*
#*
#* History:
#* --------
#* 2015/10/28, Carl, Support LinkerSymPostfix::ZILength
#*
#*
#* Author:
#* -------
#* Carl Kao (mtk08237)
#*
#****************************************************************************/
package LinkerOutputParser;
BEGIN { push @INC, './tools/', './tools/MemoryUtility/', '../' }
use Storable;
use MapFileParser;
use SymFileParser;
my $strFilePath;
my $strFileType;
my $check_parse = undef;
my $VERNO = " u0.01";
# u0.01 , 2015/01/19, Initial revision
return 1;
#****************************************************************************
# subroutine: FileParse
# Must be called first if you want to call other sub functions
# input: MAP Path string
# output: x
#****************************************************************************
sub FileParse
{
$check_parse = 1;
($strFilePath) = @_;
if ($strFilePath =~ /map$/)
{
&MapFileParser::ParseMAP($strFilePath);
$strFileType =~ s/map//ig;
$strFileType .= "MAP";
}
elsif ($strFilePath =~ /sym$/)
{
&SymFileParser::ParseSYM($strFilePath);
$strFileType =~ s/sym//ig;
$strFileType .= "SYM";
}
}
#****************************************************************************
# subroutine: StoreIntoTempFile
# input: N/A
# output: temp files which contain perl data structure
# MapParser_Temp.dat
# SymParser_Temp.dat
# data is stored into hash in xxxParser_Temp.dat
#****************************************************************************
sub StoreIntoTempFile
{
die "Must run &FileParse subroutine before run &StoreIntoTempFile\n" if (!defined $check_parse);
my ($strPath) = @_;
if ($strFileType =~ /MAP/i)
{
&MapFileParser::StoreIntoTempFile($strPath);
}
elsif ($strFileType =~ /SYM/i)
{
&SymFileParser::StoreIntoTempFile($strPath);
}
}
#****************************************************************************
# subroutine: GetParentOfSymbol
# input: Symbol Name, $strOption (Case sensitive)
# $strOption = "all" or "lib" or "obj"
# output: For map file, output is array reference,
# $strOption = "all", array content:[array1,array2,...]
# array1:[obj1,lib1]
# $strOption = "obj", array content:[obj1,obj2,...]
# $strOption = "lib", array content:[lib1,lib2,...]
#****************************************************************************
sub GetParentOfSymbol
{
die "Must run &FileParse subroutine before run &GetParentOfSymbol\n" if (!defined $check_parse);
my ($strSymbolName, $strOption) = @_;
my $parent_aref;
if($strFileType =~ /MAP/i)
{
die "Option should be all/obj/lib\n" if (($strOption ne "all") && ($strOption ne "obj") && ($strOption ne "lib"));
$parent_aref = &MapFileParser::GetParentOfSymbol($strSymbolName, $strOption);
}
return $parent_aref;
}
#****************************************************************************
# subroutine: GetChildOfSymbol
# input: Symbol Name (Case sensitive)
# output: For map file, output is array reference,
# array content:[sym1,sym2,...]
#****************************************************************************
sub GetChildOfSymbol
{
die "Must run &FileParse subroutine before run &GetChildOfSymbol\n" if (!defined $check_parse);
my ($strSymbolName) = @_;
my $child_aref;
if($strFileType =~ /MAP/i)
{
$child_aref = &MapFileParser::GetChildOfSymbol($strSymbolName);
}
return $child_aref;
}
#****************************************************************************
# subroutine: ListAllExeRegion
# input: $bTrimDebugRegion: only useful for GCC.
# 1= NeedtoTrimDebugRegion, 0 or undef=NoNeedToTrimDebugRegion
# output: For map file, output is array reference,
# array content:[ExeRegionName1,ExeRegionName2,...]
#****************************************************************************
sub ListAllExeRegion
{
die "Must run &FileParse subroutine before run &ListAllExeRegion\n" if (!defined $check_parse);
my ($bTrimDebugRegion) = @_;
my $ExeRegion_aref;
if($strFileType =~ /SYM/i)
{
$ExeRegion_aref = &SymFileParser::ListAllExeRegion($bTrimDebugRegion);
}
return $ExeRegion_aref;
}
#****************************************************************************
# subroutine: ListAllLoadRegion
# input: N/A
# output: for map file, output array reference
# array content: [LoadRegionName1,LoadRegionName2,...]
#****************************************************************************
sub ListAllLoadRegion
{
die "Must run &FileParse subroutine before run &ListAllLoadRegion\n" if (!defined $check_parse);
my $LoadRegion_aref;
if($strFileType =~ /MAP/i)
{
$LoadRegion_aref = &MapFileParser::ListAllLoadRegion;
}
return $LoadRegion_aref;
}
#****************************************************************************
# subroutine: ListPadInfo
# input: N/A
# output: array reference
# for map file, array content:[pad_array1,pad_array2,...]
# pad_array1:[strPadBaseAddress,[strPreObjName,strPreLibName],strPreObjAddress,[strPostObjName,strPostLibName],strPostObjAddress]
#****************************************************************************
sub ListPadInfo
{
die "Must run &FileParse subroutine before run &ListPadInfo\n" if (!defined $check_parse);
my $pad_aref;
if($strFileType =~ /MAP/i)
{
$pad_aref = &MapFileParser::ListPadInfo;
}
return $pad_aref;
}
#****************************************************************************
# subroutine: GetVeneerInfo
# input: N/A
# output: array reference, array content:[veneer_array1,veneer_arry2,...]
# for map file,
# veneer_array1 content:[strExeRegionName,strBaseAddress,strSize]
#****************************************************************************
sub GetVeneerInfo
{
die "Must run &FileParse subroutine before run &GetVeneerInfo\n" if (!defined $check_parse);
my $veneer_aref;
if($strFileType =~ /MAP/i)
{
$veneer_aref = &MapFileParser::GetVeneerInfo;
}
return $veneer_aref;
}
#****************************************************************************
# subroutine: GetObjSizeByExeRegion
# input: ExeRegion Name, Object Name, Library Name(Case sensitive)
# Object Name should contain ".obj"
# Library Name should contain ".lib"
# output: size of object in given execution region
#****************************************************************************
sub GetObjSizeByExeRegion
{
die "Must run &FileParse subroutine before run &GetObjSizeByExeRegion\n" if (!defined $check_parse);
my ($strExeRegionName, $strObjName, $strLibName) = @_;
die "Object name must contain .obj/.o postfix\n" if ($strObjName !~ /\.o|\*\S*\*|stub|DSP/);
die "Library name must contain .lib/.a postfix\n" if ($strLibName !~ /\.l|\.a|\*\S*\*|\*stub\*|DSP/);
my $n_size;
if($strFileType =~ /MAP/i)
{
$n_size = &MapFileParser::GetObjSizeByExeRegion($strExeRegionName, $strObjName, $strLibName);
}
return $n_size;
}
#****************************************************************************
# subroutine: GetObjSizeByCatExeRegion
# input: ExeRegion Name, Object Name, $strCategory(Case sensitive)
# Object Name should contain ".obj"
# $strCategory: RO Data/RW Data/ZI Data/Code for lis
# RO/RW/ZI for map
# output: RO/RW/ZI/RWZI size of object in given execution region
#****************************************************************************
sub GetObjSizeByCatExeRegion
{
die "Must run &FileParse subroutine before run &GetObjSizeByExeRegion\n" if (!defined $check_parse);
my ($strExeRegionName, $strObjName, $strCategory) = @_;
my $n_size = 0;
die "Object name must contain .obj/.o postfix\n" if ($strObjName !~ /\.o|\*\S*\*|stub|DSP/);
if($strFileType =~ /MAP/i)
{
die "Category should be RO/RW/ZI\n"
if (($strCategory ne "RO") && ($strCategory ne "RW") && ($strCategory ne "ZI"));
my $nObjCateSize_ref = &MapFileParser::GetObjSizeByCatExeRegion($strExeRegionName, $strCategory);
$n_size = $$nObjCateSize_ref{$strObjName};
}
return $n_size;
}
#****************************************************************************
# subroutine: GetLibSizeByExeRegion
# input: Execution Region Name, Library Name (Case sensitive)
# Library Name should contain ".lib"
# output: size of given library in givin execution region
#****************************************************************************
sub GetLibSizeByExeRegion
{
die "Must run &FileParse subroutine before run &GetLibSizeByExeRegion\n" if (!defined $check_parse);
my ($strExeRegionName, $strLibName) = @_;
die "Library name must contain .lib/.a postfix\n" if (($strLibName !~ /\.l|\.a|\*\S*\*|\*stub\*|DSP/));
my $n_size;
if($strFileType =~ /MAP/i)
{
$n_size = &MapFileParser::GetLibSizeByExeRegion($strExeRegionName, $strLibName);
}
return $n_size;
}
#****************************************************************************
# subroutine: GetObjByExeRegion
# input: Execution Region Name (Case sensitive)
# output: array reference which given execution region contains
# array content:[strObjName1,strObjName2,...]
#****************************************************************************
sub GetObjByExeRegion
{
die "Must run &FileParse subroutine before run &GetObjByExeRegion\n" if (!defined $check_parse);
my ($strExeRegionName) = @_;
my $obj_aref;
if($strFileType =~ /MAP/i)
{
$obj_aref = &MapFileParser::GetObjByExeRegion($strExeRegionName);
}
return $obj_aref;
}
#****************************************************************************
# subroutine: GetLibByExeRegion
# input: Execution Region Name (Case sensitive)
# output: array reference which given execution region contains
# array content:[strLibName1,strLibName2,...]
#****************************************************************************
sub GetLibByExeRegion
{
die "Must run &FileParse subroutine before run &GetLibByExeRegion\n" if (!defined $check_parse);
my ($strExeRegionName) = @_;
my $lib_aref;
if($strFileType =~ /MAP/i)
{
$lib_aref = &MapFileParser::GetLibByExeRegion($strExeRegionName);
}
return $lib_aref;
}
#****************************************************************************
# subroutine: ListObjSummaryInfo
# input: obj name, strOption represents which column to show(Case sensitive)
# OBJ name should contain ".obj"
# strOption = "Code"
# = "inc.data"
# = "RO Data"
# = "RW Data"
# = "ZI Data"
# = "Debug"
# output: for map file, output undef
#****************************************************************************
sub ListObjSummaryInfo
{
die "Must run &FileParse subroutine before run &ListObjSummaryInfo\n" if (!defined $check_parse);
my ($strObjName, $strOption) = @_;
die "Object name must contain .obj/.o postfix\n" if ($strObjName !~ /\.o|\*\S*\*|stub|DSP/);
my $n_size;
if($strFileType =~ /MAP/i)
{
die "Input should be RO/RW/ZI/Debug\n" if (($strOption ne "RO") && ($strOption ne "RW") && ($strOption ne "ZI") && ($strOption ne "Debug"));
$n_size = &MapFileParser::ListObjSummaryInfo($strObjName, $strOption);
}
$n_size = 0 if(!defined $n_size or $n_size eq "");
return $n_size;
}
#****************************************************************************
# subroutine: ListLibSummaryInfo
# input: lib name, strOption represents which column to show(Case sensitive)
# Lib name should contain ".lib"
# strOption = "Code"
# = "inc.data"
# = "RO Data"
# = "RW Data"
# = "ZI Data"
# = "Debug"
# output: for map file, output undef
#****************************************************************************
sub ListLibSummaryInfo
{
die "Must run &FileParse subroutine before run &ListLibSummaryInfo\n" if (!defined $check_parse);
my ($strLibName, $strOption) = @_;
die "Library name must contain .lib/.a postfix\n" if ($strLibName !~ /\.l|\.a|\*\S*\*|\*stub\*|DSP/);
my $n_size = 0;
if($strFileType =~ /MAP/i)
{
die "Input should be RO/RW/ZI/Debug\n" if (($strOption ne "RO") && ($strOption ne "RW") && ($strOption ne "ZI") && ($strOption ne "Debug"));
$n_size = &MapFileParser::ListLibSummaryInfo($strLibName, $strOption);
}
$n_size = 0 if(!defined $n_size or $n_size eq "");
return $n_size;
}
#****************************************************************************
# subroutine: GetVMAByExeRegion
# input: $strRegionName: Execution Region Name (Case sensitive)
# output: VMA for given execution region
#****************************************************************************
sub GetVMAByExeRegion
{
die "Must run &FileParse subroutine before run &GetBaseAddrByExeRegion\n" if (!defined $check_parse);
my ($strExeRegionName) = @_;
my $n_size;
if($strFileType =~ /SYM/i)
{
$n_size = hex(&SymFileParser::GetExeRegionInfo($strExeRegionName, Region::VMA));
}
return $n_size;
}
#****************************************************************************
# subroutine: GetTotalSizeByExeRegion
# input: $strRegionName: Execution Region Name (Case sensitive)
# output: total size for given execution region
#****************************************************************************
sub GetTotalSizeByExeRegion
{
die "Must run &FileParse subroutine before run &GetTotalSizeByExeRegion\n" if (!defined $check_parse);
my ($strExeRegionName) = @_;
my $n_size;
if($strFileType =~ /SYM/i)
{
$n_size = hex(&SymFileParser::GetExeRegionInfo($strExeRegionName, Region::Size));
}
return $n_size;
}
#****************************************************************************
# subroutine: GetTotalSizeByLib
# input: $strLibName: Library Name (Case sensitive)
# Library Name should contain ".lib"
# output: total size for given library
#****************************************************************************
sub GetTotalSizeByLib
{
die "Must run &FileParse subroutine before run &GetTotalSizeByLib\n" if (!defined $check_parse);
my ($strLibName) = @_;
die "Library name must contain .lib/.a postfix\n" if (($strLibName !~ /\.l|\.a|\*\S*\*|\*stub\*|DSP/));
my $n_size;
if($strFileType =~ /MAP/i)
{
$n_size = &MapFileParser::GetTotalSizeByLib($strLibName);
}
return $n_size;
}
#****************************************************************************
# subroutine: GetTotalSizeByObj
# input: $strObjName: Obj Name, $strLibName: Library Name (Case sensitive)
# Object Name should contain ".obj"
# Library Name should contain ".lib"
# output: total size for given (obj, library)
#****************************************************************************
sub GetTotalSizeByObj
{
die "Must run &FileParse subroutine before run &GetTotalSizeByObj\n" if (!defined $check_parse);
my ($strObjName, $strLibName) = @_;
die "Object name must contain .obj/.o postfix\n" if ($strObjName !~ /\.o|\*\S*\*|stub|DSP/);
die "Library name must contain .lib/.a postfix\n" if (($strLibName !~ /\.l|\.a|\*\S*\*|\*stub\*|DSP/));
my $n_size;
if($strFileType =~ /MAP/i)
{
$n_size = &MapFileParser::GetTotalSizeByObj($strObjName, $strLibName);
}
return $n_size;
}
#****************************************************************************
# subroutine: ListObjLibBySymbol
# input: $strSymName: Symbol Name (Case sensitive)
# output: for map file, output array reference
# array content:[[strObjName1,strLibName1],[strObjName2,strLibName2],...]
#****************************************************************************
sub ListObjLibBySymbol
{
die "Must run &FileParse subroutine before run &ListObjLibBySymbol\n" if (!defined $check_parse);
my ($strSymName) = @_;
my $obj_lib_aref;
if($strFileType =~ /MAP/i)
{
$obj_lib_aref = &MapFileParser::ListObjLibBySymbol($strSymName);
}
return $obj_lib_aref;
}
#****************************************************************************
# subroutine: ListObjByLib
# input: $strLibName: Library Name (Case sensitive)
# Library Name should contain ".lib"
# output: obj array reference associated with given library
# array content:[strObjName1,strObjName2,...]
#****************************************************************************
sub ListObjByLib
{
die "Must run &FileParse subroutine before run &ListObjByLib\n" if (!defined $check_parse);
my ($strLibName) = @_;
die "Library name must contain .lib/.a postfix\n" if (($strLibName !~ /\.l|\.a|\*\S*\*|\*stub\*|DSP/));
my $obj_aref;
if($strFileType =~ /MAP/i)
{
$obj_aref = &MapFileParser::ListObjByLib($strLibName);
}
return $obj_aref;
}
#****************************************************************************
# subroutine: ListLibByObj
# input: $ObjName: Object Name (Case sensitive)
# Object Name should contain ".obj"
# output: Library array reference associated with given object
# array content:[strLibName1,strLibName2,...]
#****************************************************************************
sub ListLibByObj
{
die "Must run &FileParse subroutine before run &ListLibByObj\n" if (!defined $check_parse);
my ($strObjName) = @_;
die "Object name must contain .obj/.o postfix\n" if ($strObjName !~ /\.o|\*\S*\*|stub|DSP/);
my $lib_aref;
if($strFileType =~ /MAP/i)
{
$lib_aref = &MapFileParser::ListLibByObj($strObjName);
}
return $lib_aref;
}
#****************************************************************************
# subroutine: ListObjLibByAddr
# input: symbol address
# output: objeck and lib info
#****************************************************************************
sub ListObjLibByAddr
{
die "Must run &FileParse subroutine before run &ListObjLibByAddr\n" if (!defined $check_parse);
my ($strAddress) = @_;
my $obj_lib_by_addr;
if($strFileType =~ /MAP/i)
{
$obj_lib_by_addr = &MapFileParser::ListObjLibByAddr($strAddress);
}
return $obj_lib_by_addr;
}
#****************************************************************************
# subroutine: GetObjDebugInfoSize
# input: $strObjName: Obj Name (Case sensitive)
# Object Name should contain ".obj"
# output: debug info size for given obj
#****************************************************************************
sub GetObjDebugInfoSize
{
die "Must run &FileParse subroutine before run &GetObjDebugInfoSize\n" if (!defined $check_parse);
my ($strObjName) = @_;
die "Object name must contain .obj/.o postfix\n" if ($strObjName !~ /\.o|\*\S*\*|stub|DSP/);
my $n_debugsize;
if($strFileType =~ /MAP/i)
{
$n_debugsize = &MapFileParser::GetObjDebugInfoSize($strObjName);
}
return $n_debugsize;
}
#****************************************************************************
# subroutine: FootprintAnalyzeBySymbol
# input: $strSymName: Symbol Name, $strObjName: Obj Name (Case sensitive)
# Object Name should contain ".obj" (Not necessary input for GCC SYM file)
# output: symbol info array reference
# for non Ven/Pad symbol in lis file,[strExeRegionName,strAttr,strBaseAddress,strSize]
# for Ven symbol in lis file,[strExeRegionName,strAttr,strBaseAddress,strSize,strDestinationSymbol]
# for symbol in sym file,[strExeRegionName,strAttr,strBaseAddress,strSize]
#****************************************************************************
sub FootprintAnalyzeBySymbol
{
die "Must run &FileParse subroutine before run &FootprintAnalyzeBySymbol\n" if (!defined $check_parse);
my ($strSymName, $strObjName) = @_;
my $SymbolInfo_ref;
if($strFileType =~ /SYM/i)
{
$SymbolInfo_ref = &SymFileParser::FootprintAnalyzeBySymbol($strSymName);
}
return $SymbolInfo_ref;
}
#****************************************************************************
# subroutine: GetSymbolTable
# input: N/A
# output: symbol info hash reference in the following format:
# $strAddress.$strSymbolName => [strSymbol, $strAddress, strGroup, strRegion, nSize]
#****************************************************************************
sub GetSymbolTable
{
die "Must run &FileParse subroutine before run &GetSymbolTable\n" if (!defined $check_parse);
my $SymbolInfo_aref;
if($strFileType =~ /SYM/i)
{
$SymbolInfo_aref = &SymFileParser::GetSymbolTable();
}
return $SymbolInfo_aref;
}
#****************************************************************************
# subroutine: GrepSymbolBySection
# input: $strSectionName
# output: symbol info array reference in order of address in the following format:
# [[strSymbol, $strAddress, strGroup, strRegion, nSize], ...]
#****************************************************************************
sub GrepSymbolBySection
{
die "Must run &FileParse subroutine before run &GrepSymbolBySection\n" if (!defined $check_parse);
my ($strSectionName) = @_;
my $SymbolInfo_aref;
if($strFileType =~ /SYM/i)
{
$SymbolInfo_aref = &SymFileParser::GrepSymbolBySection($strSectionName);
}
return $SymbolInfo_aref;
}
#****************************************************************************
# subroutine: GetSymbolInfo
# input: $strAddress.".".$SymbolName
# output: [$SymbolName, $strAddress, $strObjName, $strLibName, $strPreExeRegion, $strInputSectionName, $nInputSectionSize]
#
#****************************************************************************
sub GetSymbolInfo{
die "Must run &FileParse subroutine before run &GetSymbolInfo\n" if (!defined $check_parse);
my ($symbol_key) = @_;
my @symbol_info;
if($strFileType =~ /MAP/i)
{
@symbol_info = &MapFileParser::GetSymbolInfo($symbol_key);
}
return @symbol_info;
}
sub GetSymbol
{
my $SymbolInfo_aref;
if($strFileType =~ /SYM/i)
{
$SymbolInfo_aref = &SymFileParser::GetSymbol();
}
return $SymbolInfo_aref;
}
sub GetFillInfo
{
my $FillInfo_href;
if($strFileType =~ /MAP/i)
{
$FillInfo_href = &MapFileParser::GetFillInfo();
}
return $FillInfo_href;
}
#****************************************************************************
# subroutine: GetLinkerSymbolAddress
# input: nRegionType = 0: Execution Region
# nRegionType = 1: Load Region
# nRegionType = 2: Input Section
# nLocation: Base => LinkerSymPostfix::Base;
# Limit => LinkerSymPostfix::Limit;
# ZIBase => LinkerSymPostfix::ZIBase;
# ZILimit => LinkerSymPostfix::ZILimit;
# Length => LinkerSymPostfix::Length;
# ZILength => LinkerSymPostfix::ZILength;
# output: address in string
#****************************************************************************
sub GetLinkerSymbolAddress
{
die "Must run &FileParse subroutine before run &GetLinkerSymbolAddress\n" if (!defined $check_parse);
my ($strRegionName, $nLocation, $nRegionType) = @_;
my $strAddr;
if($strFileType =~ /SYM/i)
{
$strAddr = &SymFileParser::GetLinkerSymbolAddress($strRegionName, $nLocation, $nRegionType);
}
return $strAddr;
}
#****************************************************************************
# subroutine: Get_DUMMY_END_Size
# input: N/A
# output: size of DUMMY_END region
#****************************************************************************
sub Get_DUMMY_END_Size
{
my $DUMMY_END_size;
if($strFileType =~ /SYM/i)
{
$DUMMY_END_size = &SymFileParser::Get_DUMMY_END_Size;
}
return $DUMMY_END_size;
}
#****************************************************************************
# subroutine: Get_DUMMY_END_Base
# input: N/A
# output: base address of DUMMY_END region
#****************************************************************************
sub Get_DUMMY_END_Base
{
my $DUMMY_END_base;
if($strFileType =~ /SYM/i)
{
$DUMMY_END_base = &SymFileParser::Get_DUMMY_END_Base;
}
return $DUMMY_END_base;
}
#****************************************************************************
# subroutine: GetExeRegionInfo - Get Execution Region information
# input: $strRegionName: Execution Name (Case sensitive)
# $nOption for MAP file: Region::VMA
# Region::LMA
# Region::Size
# Region::Offsets
# Region::Align
# Region::Attr
# output: required ExeRegion Base address, Used Size, Region MaxSize, Attribute info...
#****************************************************************************
sub GetExeRegionInfo
{
die "Must run &FileParse subroutine before run &GetExeRegionInfo\n" if (!defined $check_parse);
my ($strRegionName, $nOption) = @_;
my $strInfo;
if($strFileType =~ /SYM/i)
{
die "Option should be Region::VMA/Region::LMA/Region::Size/Region::Offsets/Region::Align/Region::Attr\n" if (($nOption ne Region::VMA) && ($nOption ne Region::LMA) && ($nOption ne Region::Size) && ($nOption ne Region::Offsets) && ($nOption ne Region::Align) && ($nOption ne Region::Attr));
$strInfo = &SymFileParser::GetExeRegionInfo($strRegionName, $nOption);
}
return $strInfo;
}
#****************************************************************************
# subroutine: GetLoadRegionInfo - Get Load Region information
# $nOption for map file: LoadRegion::Base
# LoadRegion::Size
# LoadRegion::MaxSize
# LoadRegion::Attr
# output: required LoadRegion Base address, Used Size, Region MaxSize, Attribute info
#****************************************************************************
sub GetLoadRegionInfo
{
die "Must run &FileParse subroutine before run &GetLoadRegionInfo\n" if (!defined $check_parse);
my ($strRegionName, $nOption) = @_;
my $strInfo;
if($strFileType =~ /MAP/i)
{
$strInfo = &MapFileParser::GetLoadRegionInfo;
}
return $strInfo;
}
#****************************************************************************
# subroutine: GetExeRegionAttr - Get Region attribution
# output: region attribution =>[RO RW ZI]
#****************************************************************************
sub GetExeRegionAttr
{
die "Must run &FileParse subroutine before run &GetExeRegionAttr\n" if (!defined $check_parse);
my $region_attr;
if($strFileType =~ /MAP/i)
{
$region_attr = &MapFileParser::GetExeRegionAttr;
}
return $region_attr;
}
#****************************************************************************
# subroutine: GetTotalROSize - Get total RO size
# input: $bNeedString: 1=Return string, 0/default/no input=Return int
# output: $bNeedString=0:nROSize/ $bNeedString=1:strROSize
#****************************************************************************
sub GetTotalROSize
{
die "Must run &FileParse subroutine before run &GetTotalROSize\n" if (!defined $check_parse);
my ($bNeedString) = @_;
my $n_size;
if($strFileType =~ /MAP/i)
{
$n_size = &MapFileParser::GetTotalROSize($bNeedString);
}
return $n_size;
}
#****************************************************************************
# subroutine: GetTotalRWZISize - Get total RWZI size
# input: $bNeedString: 1=Return string, 0/default/no input=Return int
# output: $bNeedString=0:nRWZISize/ $bNeedString=1:strRWZISize
#****************************************************************************
sub GetTotalRWZISize
{
die "Must run &FileParse subroutine before run &GetTotalRWZISize\n" if (!defined $check_parse);
my ($bNeedString) = @_;
my $n_size;
if($strFileType =~ /MAP/i)
{
$n_size = &MapFileParser::GetTotalRWZISize($bNeedString);
}
return $n_size;
}
#****************************************************************************
# subroutine: GetTotalROMSize - Get total ROM size
# input: $bNeedString: 1=Return string, 0/default/no input=Return int
# output: $bNeedString=0:nROMSize/ $bNeedString=1:strROMSize
#****************************************************************************
sub GetTotalROMSize
{
die "Must run &FileParse subroutine before run &GetTotalROMSize\n" if (!defined $check_parse);
my ($bNeedString) = @_;
my $n_size;
if($strFileType =~ /MAP/i)
{
$n_size = &MapFileParser::GetTotalROMSize($bNeedString);
}
return $n_size;
}
#****************************************************************************
# subroutine: PadFillExeregSize -- search *fill* padding info for RO and RWZI in INTSRAM region
# input: execution region name, memory type
# output: memory size
#****************************************************************************
sub PadFillExeregSize
{
my ($exeregion, $type)= @_;
my $size;
$size = &MapFileParser::PadFillExeregSize($exeregion, $type);
return $size;
}
#****************************************************************************
# subroutine: GrepSymbolByInputSection
# input: input section name represent in regular expression
# ex: INTSRAM_ROCODE.*
# INTSRAM_ROCODE_A
# INTSRAM_ROCODE_B
#
# output: symbol info array reference in order of address in the following format:
# [[$strSymbolName, $strAddress, $strObjName, $strLibName, $strOutputSectionName, $strInputSectionName, $nSize], ...]
#****************************************************************************
sub GrepSymbolByInputSection
{
die "Must run &FileParse subroutine before run &GrepSymbolByInputSection\n" if (!defined $check_parse);
my ($strSectionNameInRegularExp) = @_;
my $syminfo_aref;
if($strFileType =~ /MAP/i)
{
$syminfo_aref = &MapFileParser::GrepSymbolByInputSection($strSectionNameInRegularExp);
}
return $syminfo_aref;
}
#****************************************************************************
# subroutine: GrepSymbolByOutputSection
# input: input section name represent in regular expression
# ex: CACHED_EXTSRAM_L2CACHE_LOCK_DATA
# CACHED_EXTSRAM_L2CACHE_LOCK_DATA
# CACHED_EXTSRAM_L2CACHE_LOCK_DATA_ZI
#
# output: symbol info array reference in order of address in the following format:
# [[$strObjName, $strLibName], [$strObjName, $strLibName] ...]
#****************************************************************************
sub GrepSymbolByOutputSection
{
die "Must run &FileParse subroutine before run &GrepSymbolByInputSection\n" if (!defined $check_parse);
my ($strSectionNameInRegularExp) = @_;
my $syminfo_aref;
if($strFileType =~ /SYM/i)
{
$syminfo_aref = &SymFileParser::GrepSymbolByOutputSection($strSectionNameInRegularExp);
}
return $syminfo_aref;
}
__END__
=head1 NAME
LinkerOutputParser - Perl module to parse linker output files: .lis/.map/.sym
=head1 SYNOPSIS
use LinkerOutputParser;
=head2 Table of Contents
LinkerOutputParser consists of a collection of modules whose details
are too big to fit in one document. This POD itself explains the
top-level APIs and general topics at a glance. For other topics and
more details, see the PODs below:
Name Description
--------------------------------------------------------
LisFileParser Parser module for .lis file
MapFileParser Parser module for .map file
SymFileParser Parser module for .sym file
--------------------------------------------------------
=head1 DESCRIPTION
The module provides the interfaces to parse RVCT/GCC linker output files.
=head1 EXAMPLES
Here are some code samples showing a possible usage of LinkerOutputParser:
1. How do I get all execution region list from .lis/.sym file?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $exeregion_aref = &LinkerOutputParser::ListAllExeRegion;
if (defined $exeregion_aref)
{
foreach my $temp(@$exeregion_aref)
{
print "$temp\n";
}
}
which prints (on my machine):
BL_GFH_SECTION
READ_ONLY
READ_ONLY_HEAD
READ_ONLY_TAIL
READ_WRITE
READ_ONLY_INT
READ_WRITE_INT
EMIINIT_CODE
STACK_AREA
EXT_UN_INIT
SHARE_BUF
READ_WRITE_SYS_RAM
DUMMY_END
BL_SIGNATURE_SECTION
2. How do I get al load region list from .lis file?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $loadregion_aref = &LinkerOutputParser::ListAllLoadRegion;
if (defined $loadregion_aref)
{
foreach my $temp(@$loadregion_aref)
{
print "$temp\n";
}
}
which prints (on my machine):
READ_ONLY
3. How do I get base address/size/maxsize/attribute of an execution region?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $base_address = &LinkerOutputParser::GetExeRegionInfo('BL_GFH_SECTION', ExecutionRegion::Base);
print "$base_address\n";
my $size = &LinkerOutputParser::GetExeRegionInfo('BL_GFH_SECTION', ExecutionRegion::Size);
print "$size\n";
which prints (on my machine):
0x40000900
0x150
4. How do I get base address/size/maxsize/attribute of an load region?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $base_address = &LinkerOutputParser::GetLoadRegionInfo('READ_ONLY', LoadRegion::Base);
print "$base_address\n";
my $size = &LinkerOutputParser::GetLoadRegionInfo('READ_ONLY', LoadRegion::Size);
print "$size\n";
which prints (on my machine):
0x40000900
0x4114
5. How do I get all objects in an execution region?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $obj_aref = &LinkerOutputParser::GetObjByExeRegion("BL_GFH_SECTION");
if (defined $obj_aref)
{
foreach my $temp(@$obj_aref)
{
print "$temp\n";
}
}
which prints (on my machine):
bl_GFH_body.obj
custom_emi_MT6255.obj
bl_Secure_v5.obj
6. How do I get all libraries in an execution region?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $lib_aref = &LinkerOutputParser::GetLibByExeRegion("READ_ONLY_TAIL");
if (defined $lib_aref)
{
foreach my $temp(@$lib_aref)
{
print "$temp\n";
}
}
which prints (on my machine):
bootloader.lib
sss_rvct_sv5.lib
c_5.l
h_5.l
f_5s.l
sst_sec.lib
7. How do I get object, library associated with a symbol?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $objlib_aref = &LinkerOutputParser::ListObjLibBySymbol(".text");
foreach my $temp(@$objlib_aref)
{
print "$temp->[0], $temp->[1]\n";
}
which prints (on my machine):
strcpy.o, c_5.l
_fptrap.o, c_5.l
defsig_fpe_outer.o, c_5.l
defsig_exit.o, c_5.l
defsig_fpe_inner.o, c_5.l
defsig_general.o, c_5.l
sys_wrch.o, c_5.l
rt_memcpy_w.o, c_5.l
rt_memclr_w.o, c_5.l
llmullu.o, h_5.l
rt_memmove_w.o, c_5.l
llmul.o, c_5.l
rt_fp_status_addr.o, c_5.l
sys_exit.o, c_5.l
use_no_semi.o, c_5.l
8. How do I get all objects in a library?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $obj_aref = &LinkerOutputParser::ListObjByLib("sst_sec.lib");
if(defined $obj_aref)
{
foreach my $temp(@$obj_aref)
{
print "$temp\n";
}
}
which prints (on my machine):
SSS_interface.obj
br_crypto_platform.obj
9. How do I get all libraries associated with an object?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $lib_aref = &LinkerOutputParser::ListLibByObj("lpwr.obj");
if(defined $lib_aref)
{
foreach my $temp(@$lib_aref)
{
print "$temp\n";
}
}
which prints (on my machine):
bootloader.lib
10. How do I get execution region total size?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $exeregion_size = &LinkerOutputParser::GetTotalSizeByExeRegion("BL_GFH_SECTION");
print "$exeregion_size\n";
which prints (on my machine):
336
11. How do I get total size of a library?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $lib_size = &LinkerOutputParser::GetTotalSizeByLib("f_5s.l");
print "$lib_size\n";
which prints (on my machine):
1320
12. How do I get total size of an object?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $obj_size = &LinkerOutputParser::GetTotalSizeByObj("bl_BOOTARM.obj","bootloader.lib");
print "$obj_size\n";
which prints (on my machine):
4304
13. How do I get size of an object in a certain execution region?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $obj_size = &LinkerOutputParser::GetObjSizeByExeRegion("READ_ONLY_TAIL", "bl_FTL.obj", "bootloader.lib");
print "$obj_size\n";
which prints (on my machine):
256
14. How do I get size of a library in a certain execution region?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $lib_size = &LinkerOutputParser::GetLibSizeByExeRegion("BL_GFH_SECTION", "bootloader.lib"); ##300
print "$lib_size\n";
which prints (on my machine):
288
15. How do I get total RO size for a .lis file?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $ROSize = &LinkerOutputParser::GetTotalROSize;
print "Total ROSize is $ROSize\n";
which prints (on my machine):
Total ROSize is 16452
16. How do I get total RWZI size for a .lis file?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $RWZISize = &LinkerOutputParser::GetTotalRWZISize;
print "Total RWZISize is $RWZISize\n";
which prints (on my machine):
Total RWZISize is 52864
17. How do I get total ROM size for a .lis file?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $ROMSize = &LinkerOutputParser::GetTotalROMSize;
print "Total ROMSize is $ROMSize\n";
which prints (on my machine):
Total ROMSize is 16660
18. How do I get debug info size for an object?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $debug_size = &LinkerOutputParser::GetObjDebugInfoSize('SSS_Secure_v5.obj');
print "$debug_size\n";
which prints (on my machine):
4683
19. How do I get footprint infomation of a symbol?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $footprint_info_ref = &LinkerOutputParser::FootprintAnalyzeBySymbol("i.CacheInitMini", "bl_Cache.obj");
foreach my $temp(@$footprint_info_ref) ### array content: [ExecutionRegionName, Attribute, BaseAddress, Size] for common symbols
{ ### array content: [ExecutionRegionName, Attribute, BaseAddress, Size, DestinationSymbol] for veneers
print "$temp\n";
}
print "\n";
which prints (on my machine):
READ_ONLY_TAIL
RO-Code
0x40000b8c
0x0000000c
20. How do I get parent symbols which refer to certain symbol?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $parent_aref = &LinkerOutputParser::GetParentOfSymbol("NFIDriverInit");
if(defined $parent_aref)
{
foreach my $temp(@$parent_aref)
{
print "$temp\n";
}
}
which prints (on my machine):
Init
21. How do I get child symbols which certain symbol refers to?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $child_aref = &LinkerOutputParser::GetChildOfSymbol("itoa");
if(defined $child_aref)
{
foreach my $temp(@$child_aref)
{
print "$temp\n";
}
}
which prints (on my machine):
__aeabi_idivmod
.bss
22. How do I know pad infomation?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $pad_aref = &LinkerOutputParser::ListPadInfo;
if (defined $pad_aref)
{
foreach my $temp(@$pad_aref)
{
print "$temp->[0], $temp->[1], $temp->[2], $temp->[3], $temp->[4]\n";
### array content: [pad_address, previous_symbol_name, previous_symbol_address, post_symbol_name, post_symbol_address]
}
}
which prints (on my machine):
0x40004075, x$divrt, 0x40003e80, x$fpl$dcmpinfnan, 0x40004078
0x40004545, .constdata, 0x40004544, .constdata, 0x40004548
0x40004652, .constdata, 0x40004548, .constdata, 0x40004654
0x4000471a, .constdata, 0x40004654, .constdata, 0x4000471c
0x40004822, .constdata, 0x4000471c, .constdata, 0x40004824
0x40004b97, .bss, 0x4000496c, .bss, 0x40004b98
0x40004bed, .bss, 0x40004bec, .bss, 0x40004bf0
0x50000076, INTERNCODE, 0x50000068, INTERNCODE, 0x50000078
0x40000e9e, i.TimeStampInit, 0x40000e9c, i.VerifyExtBootloader, 0x40000ea0
0x40000ef2, EMIINITCODE, 0x40000eea, EMIINITCODE, 0x40000ef4
0x40001cbe, i.GFH_Find, 0x40001cac, i.GFH_Internal_Parser, 0x40001cc0
0x40003302, i.dbg_print, 0x400032ec, i.lpwr_default_callback, 0x40003304
23. How do I know veneer infomation?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $veneer_aref = &LinkerOutputParser::GetVeneerInfo;
if(defined $veneer_aref)
{
foreach my $temp(@$veneer_aref)
{
print "$temp->[0], $temp->[1], $temp->[2], $temp->[3]\n";
### array content: [ExecutionRegionName, BaseAddress, Size, DestinationSymbolName]
}
}
which prints (on my machine):
READ_ONLY_TAIL, 0x40000c84, 0x00000008, JumpToExtBootloader
READ_ONLY_TAIL, 0x40002808, 0x00000008, CP_Crypto_Init
READ_ONLY_TAIL, 0x40002810, 0x00000008, CP_Get_MTK_Cipher_Key_Len
READ_ONLY_TAIL, 0x40002818, 0x00000008, SaveAndSetIRQMask
READ_ONLY_TAIL, 0x40002820, 0x00000008, RestoreIRQMask
READ_ONLY_TAIL, 0x40002828, 0x00000008, JumpCmd
READ_ONLY_INT, 0x5000004c, 0x00000008, SSS_Crypto_Config_Init
READ_ONLY_INT, 0x50000054, 0x00000008, SSS_Crypto_Context_Validation
READ_ONLY_INT, 0x5000005c, 0x00000008, ASSERT
24. What if I want to know Code/RO/RW/ZI/Debug size of an object?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $ZIData_size = &LinkerOutputParser::ListObjSummaryInfo("lpwr.obj", "ZI Data");
print "$ZIData_size\n";
my $Debug_size = &LinkerOutputParser::ListObjSummaryInfo("lpwr.obj", "Debug");
print "$Debug_size\n";
which prints (on my machine):
1946
6344
25. What if I want to know Code/RO/RW/ZI/Debug size of a library?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file); # Must run this subroutine first for other activities
my $ROData_size = &LinkerOutputParser::ListLibSummaryInfo("bootloader.lib", "RO Data");
print "$ROData_size\n";
my $RWData_size = &LinkerOutputParser::ListLibSummaryInfo("bootloader.lib", "RW Data");
print "$RWData_size\n";
which prints (on my machine):
917
208
26. How to retrieve data from temp files which reserved when parsing?
use LinkerOutputParser;
my $file = "E:\\APOLLO55N_V2_DEMO_BOOTLOADER_V005_MT6255_MAUI_11B_W12_08.lis";
&LinkerOutputParser::FileParse($file);
&LinkerOutputParser::StoreIntoTempFile("E:\\mtk80506"); ## You can identify your preferred path to store temp files
my $data_hash = retrieve 'E:\\mtk80506\\LisParser_Temp.dat'; ## temp file names: your_path\LisParser_Temp.dat or your_path\SymParser_Temp.dat or your_path\MapParser_Temp.dat
foreach my $key (keys %$data_hash)
{
print "$key\n";
}
which prints (on my machine):
debug_size
parent_reference
symbol_info
obj_summary
execution_region
child_reference
load_region
lib_summary
Then you can retrieve more detailed data, for example, you want to retrieve "child_reference" data (usually are hash/array reference):
my $child_value = $$data_hash{"child_reference"};
foreach my $key (keys %$child_value)
{
my $array_ref = $$child_value{$key};
foreach my $temp(@$array_ref)
{
print "$key->$temp\n";
}
}
which prints (on my machine):
lpwr_group_init->.bss
lpwr_group_init->.constdata
_3DES_KeyOptionHandler->__aeabi_memcpy
Init->uart_init
Init->set_debug_level
Init->bl_print
Init->DclF32K_Initialize
Init->WaitFor32KStable
Init->lpwr_init
Init->DRVPDN_ini
Init->NFIDriverInit
Init->bl_Is_Brom_Cmd_Mode_Disabled
Init->DummyReference
Init->SSS_Init_Share_Crypto_Drv
Init->SST_SWB_Init
Init->bootloader_debug_level
Init->g_randomSeed
Init->BL_RESV_REGION
Init->g_bromCmdModeDisabled
Init->EMI_INFO_2
Init->__user_initial_stackheap
kal_assert_fail_specific_ext->dbg_print
drv_get_duration_ms->drv_get_duration_tick
...
=cut